LeetCode 补充题 22. IP地址与整数的转换
题目描述
思路分析
解法一:字符串分割 + 位运算(推荐)
核心思路:
- IP 转整数:按
.分割字符串,得到 4 段十进制数,依次左移 24、16、8、0 位后做按位或,拼接成 32 位整数。- 整数转 IP:循环 4 次,每次取最低 8 位(
& 0xFF),转为十进制拼入结果,然后右移 8 位;最终将 4 段倒序拼接(或每次插入头部)还原出点分十进制字符串。- Java 注意事项:
int是有符号 32 位整型,IP 最高位为 1 时会溢出为负数;整数转 IP 时需使用无符号右移>>>或用long存储,避免算术右移补 1 带来的错误。
复杂度分析:
- 时间复杂度:O(1),IP 地址固定 4 段,字符串操作次数为常数。
- 空间复杂度:O(1),仅使用常数个辅助变量。
public class Solution {
/**
* IP 地址转 32 位整数
* 将点分十进制 IP 拆分为 4 段,依次左移拼接
*/
public long ipToInt(String ip) {
String[] parts = ip.split("\\.");
long result = 0;
for (String part : parts) {
// 每次左移 8 位,将当前段拼入低 8 位
result = (result << 8) | Long.parseLong(part);
}
return result;
}
/**
* 32 位整数转 IP 地址
* 每次取低 8 位,逆序拼接为点分十进制
*/
public String intToIp(long num) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 4; i++) {
// 取当前最低 8 位
sb.insert(0, num & 0xFF);
if (i < 3) {
sb.insert(0, ".");
}
// 无符号右移 8 位,准备下一段
num >>= 8;
}
return sb.toString();
}
}
// ipToInt 将点分十进制 IP 转换为 32 位无符号整数
func ipToInt(ip string) uint32 {
parts := strings.Split(ip, ".")
var result uint32
for _, part := range parts {
num, _ := strconv.Atoi(part)
// 每次左移 8 位,将当前段拼入低 8 位
result = (result << 8) | uint32(num)
}
return result
}
// intToIP 将 32 位无符号整数转换为点分十进制 IP 地址
func intToIP(num uint32) string {
parts := make([]string, 4)
for i := 3; i >= 0; i-- {
// 取当前最低 8 位
parts[i] = strconv.Itoa(int(num & 0xFF))
// 右移 8 位,准备下一段
num >>= 8
}
return strings.Join(parts, ".")
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 93. 复原 IP 地址 | 中等 | 字符串分割、回溯 |
| 468. 验证IP地址 | 中等 | 字符串解析、分段验证 |
| 751. IP 到 CIDR | 中等 | 位运算、IP 地址处理 |
| 67. 二进制求和 | 简单 | 字符串转换、位运算 |
| 190. 颠倒二进制位 | 简单 | 位运算、移位操作 |
| 8. 字符串转换整数 (atoi) | 中等 | 字符串解析、数字转换 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!