题解 | #整数与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 一个
主要考察点在于字符串操作
查看16道真题和解析