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

整数与IP地址间的转换

https://www.nowcoder.com/practice/66ca0e28f90c42a196afd78cc9c496ea?tpId=37&tqId=21256&ru=/exam/oj

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Main main = new Main();
        Scanner in = new Scanner(System.in);
        String ip = in.nextLine();
        String numStr = in.nextLine();
        System.out.println(main.IpToNum(ip));
        System.out.println(main.NumToIp(Long.parseLong(numStr)));
    }


    // 数字转 Ip 地址
    public String NumToIp(Long num){

        // 转换为 二进制 字符串
        String biNum = Long.toBinaryString(num);
        int len = biNum.length();
        // 用于拼接整合结果
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<32-len; i++){
            sb.append("0");
        }
        sb.append(biNum);
        // 每八位加入一个 "."
        sb.insert(8, ".");
        sb.insert(17, ".");
        sb.insert(26, ".");

        String biAn = new String(sb);
        String[] strs = biAn.split("\\.");
        int[] reduce = Arrays.stream(strs).mapToInt(string -> Integer.parseInt(string, 2)).toArray();
        String ans = "";
        for(int i=0; i<4; i++){
            ans += reduce[i];
            if(i != 3){
                ans += ".";
            }
        }
        return ans;
    }

    public Long IpToNum(String ip){
        String[] strs = ip.split("\\.");
        String ans = "";
        // 组合 ans
        for(int i=0; i<4; i++){
            String cur = strs[i];
            int num = Integer.parseInt(cur);
            String biNum = Integer.toBinaryString(num);
            int zeroNums = 8 - biNum.length();
            while(zeroNums > 0){
                biNum = "0" + biNum;
                zeroNums--;
            }
            ans += biNum;
        }
        // 把 ans 转为 10 进制
        Long ansNum = Long.parseLong(ans, 2);
        return ansNum;
    }
}

思路:

两个函数, Ip 转 Num 一个, Num 转 Ip 一个

主要考察点在于字符串操作

全部评论

相关推荐

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