[LeetCode] 1108. Defanging an IP Address IP地址无效化


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 题目讲解汇总(持续更新中...)

posted @ 2021-05-05 12:48  Grandyang  阅读(572)  评论(0编辑  收藏  举报
Fork me on GitHub