前言
明天持续为大家补充 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;
}