前言

明天持续为大家补充Leetcode没有的高频面试题:IP地址与int整数的转换

援用几篇面经原文形容

  • 给你一个IP4的地址,请转成十进制整数 (2021-03 腾讯-PCG-前端)
  • 手撕算法: ip地址转整数 (2021-03 腾讯-TEG-后端)
  • ip字符串转整型(2021-02 快手-效率工程-后端)
    5min的工夫,带你把握这个题。

题目形容

ip地址与整数的转换。

例如,ip地址为10.0.3.193,把每段拆分成一个二进制模式组合起来为00001010 00000000 00000011 11000001,而后把这个二进制数转变成十进制整数就是167773121。

题目剖析

借助位运算实现。如IP10.0.3.193,将10左移24位,0左移16位,3左移8位,193左移0位。4个seg或运算,即为后果。

上代码,python 7行代码就能够实现(为不便了解,代码没有应用循环)

def ipToInt(ip):    ipList = ip.split(".")    seg0 = int(ipList[0]) << 24    seg1 = int(ipList[1]) << 16    seg2 = int(ipList[2]) << 8     seg3 = int(ipList[3])    return seg0 | seg1 | seg2 | seg3

留神:C++实现时,后果要应用无符号整数。否则,高位为1时,后果会显示正数。

咱们再来看一下如何将整数转成IP。
将整数和255做与运算,后果为IP的第4段。整数右移8位,和255做与运算的后果就是IP的第3段...最初再将每轮与运算的后果拼接起来便是最终的IP地址。

以下是python代码的实现(为不便了解,代码没有应用循环)

def intToIp(num):     res = []    res.append(str(num & 255))    res.append(str(num>>8 & 255))    res.append(str(num>>16 & 255))    res.append(str(num>>24 & 255))    res.reverse()    return ".".join(res)

参考代码

以下附上C++版的参考代码

#include <iostream>#include <vector>#include <algorithm>using namespace std;unsigned ipToInt(string ip) {    int l = ip.size();    vector<int> ipList;    //split    for (int i = 0; i < l; i++) {        int j = i;        while (j < l && ip[j] != '.') j++;        ipList.push_back(stoi(ip.substr(i, j - i)));        i = j;    }    int n = ipList.size();    unsigned res = 0;    for (int i = 0; i < n; i++) {        res = res << 8 | ipList[i];    }    return res;}string intToIp(unsigned num) {    vector<string> ipList;    string res = "";    for(int i = 0; i < 4; i ++) {        string seg = to_string(num & 255);        ipList.push_back(seg);        num = num >> 8;    }