题解 | #整数与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 一个

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

全部评论

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
海螺很能干:每次看到这种简历都没工作我就觉得离谱
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务