题解 | #整数与IP地址间的转换#

整数与IP地址间的转换

http://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea

【JAVA】此题踩的坑如下:
1.IP转转整数时:
(1)10进制转2进制,不足8的需要在2进制字符串前面补0至8位
2.整数转IP时:
(1)10进制转2进制字符串,不足32的需要在2进制字符串前面补0至32位
(2)由于int型的范围是:-2^31~2^31-1,因此,此处若用整型的进制转换函数会超出范围,因此使用long型的各类进制转化函数!

import java.util.Scanner;

/**
 * @author m
 * @Description 整数与IP地址间的转换
 * 一。题目要求:
 * 输入:
 * 1.输入IP地址 —— 输出:整数
 * 2. 输入整数 —— 输出:IP地址
 *
 * 二、思路:(1)ip->整数
 * 1. 分割IP地址为4个整数
 * 2. 每个整数转化为各自的2进制,拼接起来
 *        不足8位的二进制,要在前面补0;[倒着遍历]
 * 3. 将2中的2进制字符串转化为10进制
 *
 * (2)逆过程:整数->ip
 * 1. 10进制整数转为2进制字符串
 * 2. 每8位进行分隔
 * 3. 对每8位的2进制字符串转为10进制整数
 * @creat 2021-07-19
 */
public class HJ33 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String s1 = sc.nextLine();
            String s2 = sc.nextLine();
            long res1 = encode(s1);
            System.out.println(res1);
            String res2 = decode(s2);
            System.out.println(res2);

        }
    }

    static long encode(String s){
        String[] str = s.trim().split("\\."); //坑1:split函数,以"."分隔时,要加转义字符"\\."
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<str.length;i++){
            String s1 = Integer.toBinaryString(Integer.parseInt(str[i]));//十进制-2进制
            if(s1.length()<8){
                for(int j=0;j<8-s1.length();j++){//10进制转2进制时,不足8位的补0至8位
                    sb.append("0");//
                }
            }
            sb.append(s1);//补完0以后,再添加字符串
        }
        //2进制-10进制
        long res = Long.parseLong(sb.toString(),2);
        return res;
    }

    static String decode(String s){
        //1.10进制数-2进制字符串:
        String s22 = Long.toBinaryString(Long.parseLong(s));
        //不足32位的,要在前面补32-N个0;
        StringBuilder s2 = new StringBuilder();
        if(s22.length()<32){
            for(int j=0;j<32-s22.length();j++){
                s2.append("0");
            }
        }
        s2.append(s22);

        //2.每8位进行分隔
        String[] ss = new String[4];
        StringBuilder res = new StringBuilder();
        for(int i=0;i<ss.length;i++){
            ss[i] = s2.substring(8*i,8*(i+1));
            //3.对每8位的2进制字符串转为10进制整数
            int num = Integer.parseInt(ss[i],2);
            res.append(num).append(".");
        }

        res.deleteCharAt(res.length()-1);//删除最末尾多余的"."
        return res.toString();
    }
}

全部评论

相关推荐

11-05 07:29
贵州大学 Java
点赞 评论 收藏
分享
Java抽象带篮子:难蚌,点进图片上面就是我的大头😆
点赞 评论 收藏
分享
评论
6
5
分享
牛客网
牛客企业服务