LeetCode 补充题 22. IP地址与整数的转换

题目描述

补充题 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) 中等 字符串解析、数字转换
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/70714196
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!