1108. Defanging an IP Address

Given a valid (IPv4) IP address, return a defanged version of that IP address.

defanged IP address  replaces every period "." with "[.]".

Example 1:

Input: address = "1.1.1.1"
Output: "1[.]1[.]1[.]1"

Example 2:

Input: address = "255.100.50.0"
Output: "255[.]100[.]50[.]0"

Constraints:

  • The given address is a valid IPv4 address.

这道题给了一个 IP 地址,让把其中的点都换成用中括号包起来的点,这种字符替换的问题,用 Java 的话可以说是太方便了,各种函数可以调用,比如 replace, join, replaceAll 等等,好用的飞起。但是很可惜博主是用的 C++,所以用不了这些函数,而是要是用字符串流类,将给定的字符串根据点的位置分开,并把每段字符串提取出来,然后加到结果 res 之后,并加上 [.],这种最终会多加一个中括号,别忘移除掉即可,参见代码如下:

解法一:

class Solution {
public:
    string defangIPaddr(string address) {
        string res, t;
        istringstream is(address);
        while (getline(is, t, '.')) {
            res += t + "[.]";
        }
        return res.substr(0, (int)res.size() - 3);
    }
};

其实不用字符串流类也可以,就是直接遍历原字符串,遇到点了,就直接把 [.] 加入,否则就加入当前字符即可,参见代码如下:

解法二:

class Solution {
public:
    string defangIPaddr(string address) {
        string res;
        for (char c : address) {
            if (c == '.') res += "[.]";
            else res += c;
        }
        return res;
    }
};

虽然前面提到了 C++ 中没有很强大的字符串替换的方法,但是这里也可以用 regex_replace 来直接进行替换,一行搞定碉堡了有木有,参见代码如下:

解法三:

class Solution {
public:
    string defangIPaddr(string address) {
        return regex_replace(address, regex("[.]"), "[.]");
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/1108

参考资料:

https://leetcode.com/problems/defanging-an-ip-address/

https://leetcode.com/problems/defanging-an-ip-address/discuss/328855/C%2B%2B-1-liner-(regex_replace)

https://leetcode.com/problems/defanging-an-ip-address/discuss/328895/JavaPython-3-3-One-liners-%2B-one-wo-lib.

LeetCode All in One 题目讲解汇总(持续更新中…)


转载请注明来源于 Grandyang 的博客 (grandyang.com),欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 grandyang@qq.com

💰


微信打赏


Venmo 打赏

(欢迎加入博主的知识星球,博主将及时答疑解惑,并分享刷题经验与总结,试运营期间前五十位可享受半价优惠~)

×

Help us with donation