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

整数与IP地址间的转换

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

import java.util.*;

/**
 * 原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
 * 一个长整数。
 * 举例:一个ip地址为10.0.3.193
 * 每段数字             相对应的二进制数
 * 10                   00001010
 * 0                    00000000
 * 3                    00000011
 * 193                  11000001
 * 组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
 * 数据范围:保证输入的是合法的 IP 序列
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String strIp = in.nextLine();
            String strNum = in.nextLine();
            int step = 8;
            String[] arr1 = strIp.split("\\.");
            StringBuilder sbDes = new StringBuilder();
            for (String s : arr1) {
                String binStr = Integer.toBinaryString(Integer.parseInt(s));
                StringBuilder sb = new StringBuilder(binStr);
                for (int i = 0; i < step - binStr.length(); i++) {//补齐不够8位的0
                    sb.insert(0, '0');
                }
                sbDes.append(sb);
            }
            long d = Long.parseLong(sbDes.toString(), 2);
            System.out.println(d);

            //十进制转ip
            long n = Long.parseLong(strNum);
            String bs2 = Long.toBinaryString(n);
            StringBuilder sb2 = new StringBuilder(bs2);
            int j = sb2.length() % step;//除以8有余数时,要补齐0
            if (j > 0) {
                for (int i = 0; i < step-j; i++) {
                    sb2.insert(0, '0');
                }
            }
            int size = (int) (sb2.length() / step + 0.5f);
            String[] arr2 = new String[size];//00001010 00000000 00000011 11000001
            int start = 0, end = step;
            for (int i = 0; i < arr2.length; i++) {
                arr2[i] = sb2.substring(start, end);
                start = end;
                end += step;
            }
            StringBuilder sb3 = new StringBuilder(arr2.length * 2 - 1);
            for (String s : arr2) {
                int i = Integer.parseInt(s, 2);
                sb3.append(i).append('.');
            }
            String des2 = sb3.substring(0, sb3.length() - 1);
            System.out.println(des2);

        }
    }
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务