LeetCode 1108 IP 地址无效化[二] | Java 刷题打卡

193 阅读2分钟

本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接

题目描述

IP 地址无效化

给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本。所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 "."

示例 1:

输入:address = "1.1.1.1"
输出:"1[.]1[.]1[.]1"

示例 2:

输入:address = "255.100.50.0"
输出:"255[.]100[.]50[.]0"

思路分析

很多人可能会使用replace(".","[.]"),也就是将本道题的核心使用 Java API 一步解决,这肯定不是面试官想看到的答案,在判断能否使用 Api 来求解算法题的时候有个标准,就是这个 API 有没有简单粗暴的将核心逻辑代替。第一种解法是使用 StringBuilder 去一个个判断并拼接单个字符,该解法的时间复杂度是O(n){O(n)},空间复杂度也是O(n){O(n)}

还有一种解法是将该字符串转换为 char[] 数组,无效化后长度比数组长度原先增加了 6(2*3),然后在遍历添加进新数组中,最后转换为字符串。该解法的时间复杂度是O(n){O(n)},空间复杂度也是O(n){O(n)}

代码展示

解法一:遍历该字符串,使用 StringBuilder 拼接,时间复杂度是O(n){O(n)},空间复杂度也是O(n){O(n)}

public String defangIPaddr(String address) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < address.length(); i++) {
            if (address.charAt(i) == '.') {
                sb.append("[.]");
            } else {
                sb.append(address.charAt(i));
            }
        }
        return sb.toString();
    }

解法二:将该字符串转换为 char[] 数组,无效化后长度比数组长度原先增加了 6(2*3),然后在遍历添加进新数组中,最后转换为字符串。该解法的时间复杂度是O(n){O(n)},空间复杂度也是O(n){O(n)}

    public String defangIpaddr(String address) {
        char[] a = address.toCharArray();
        int length = a.length + 2 * 3;
        char[] targetArray = new char[length];
        int j = 0;
        for (char c : a) {
            if ('.' == c) {
                targetArray[j++] = '[';
                targetArray[j++] = '.';
                targetArray[j++] = ']';
            } else {
                targetArray[j] = c;
                j++;
            }
        }
        return new String(targetArray);
    }

总结

在解答该类编程题时尤其要注意切记使用 API 去简单粗暴的解决算法题的核心逻辑,API 通常只能用来解决部分逻辑,而不是用来替代核心逻辑,本文的两种解决方案的时间复杂度和空间复杂度都是O(n){O(n)}