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

整数与IP地址间的转换

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

import java.util.*;
/*
看大家都是用了公式来计算二进制,我是用了死办法,按位计算按位相除,但在一个地方有个坑,大家一定要把int设置为long,要不然会越界,导致部分样例通过不了

*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
             String s=in.nextLine();
            if(s.contains(".")){
               String[] str=s.split("\\.");
               StringBuilder res=new StringBuilder();
               long sum=0;
               for(int i=0;i<str.length;i++){
                  StringBuilder temp=new StringBuilder();
                  Stack<Integer> stack=new Stack<>();
                  int n=Integer.parseInt(str[i]);
                  while(n>0){
                    int a=n%2;
                    n=n/2;
                    stack.push(a);
                  }
                  while(stack.size()!=8){
                     stack.push(0);
                  }
                  while(!stack.isEmpty()){
                      temp.append(stack.peek());
                      stack.pop();
                  }
                  res.append(temp);
               }
               String newS=res.toString();
               for(int i=newS.length()-1;i>=0;i--){
                  if(newS.charAt(i)=='1'){
                    int index=newS.length()-1-i;
                    sum+=Math.pow(2,index);
                  }
               }
               System.out.println(sum);
            }else{
                String s1="";
                long count=Long.parseLong(s);
                while(count>0){
                    long a=count%2;
                    count=count/2;
                    s1=String.valueOf(a)+s1;  
                }
                while(s1.length()!=32){
                    s1="0"+s1;
                }
                int start=0;
                int end=8;
                int[] arr=new int[4];
                int k=0;
                while(end<=s1.length()){
                    String sub=s1.substring(start,end);
                    int sum=0;
                    for(int i=sub.length()-1;i>=0;i--){
                        if(sub.charAt(i)=='1'){
                        int index=sub.length()-1-i;
                        sum+=Math.pow(2,index);
                        } 
                    }
                    arr[k++]=sum;
                    start=end;
                    end+=8;
                }
                for(int i=0;i<arr.length;i++){
                    System.out.print(arr[i]);
                    if(i!=arr.length-1){
                        System.out.print(".");
                    }
                }
                System.out.println();
            }
            
        }
    }
}

全部评论

相关推荐

10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务