题解 | #整数与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(); } }