1108. 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"
 

提示:

给出的 address 是一个有效的 IPv4 地址

string成员函数replace较为弱小,稍加修改方便替换字符串
抽象图一二ij

class Solution {
public:
    string defangIPaddr(string address) {
        return replace(address,".","[.]");
    }
    string replace(string resourceStr,string subStr,string newStr){
        int i=0;
        while((i=resourceStr.find(subStr,i))!=-1){
            resourceStr.replace(i,subStr.size(),newStr);
            i+=newStr.size();
        }
        return resourceStr;
    }
};

解题思路

这题太简单了,是在没啥写的,来个一题三解吧,两种调用 api,一种循环

/**
 * @param {string} address
 * @return {string}
 */
var defangIPaddr = function (address) {
  let str = ''
  for (let i = 0; i < address.length; i++) {
    if (address[i] !== '.') {
      str += address[i]
    } else {
      str += '[.]'
    }
  }
  return str
};

C++字符串衔接

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

java 最简单思路

 

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

Java三种解法,第三种双100%解决

直接使用 String 类的 replace。

class Solution {
    public String defangIPaddr(String address) {
        return address.replace(".", "[.]");
    }
}
使用 address 创建 StringBuilder,遍历,遇到 '.' 使用 insert。

class Solution {
    public String defangIPaddr(String address) {
        StringBuilder s = new StringBuilder(address);
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '.') {
                s.insert(i + 1, ']');// 先插入后面,此时 i 下标仍是'.'
                s.insert(i, '[');// 插入 '.' 前面,此时 i 下标是'[' ,i+2 下标为']'
                i += 3;// 故 i 直接加 3,为下一个字符,注意此时已经是原来 i+1 下标的字符了;
                //此次循环结束进入下次循环还会进行加 1,不过又因为 ip 地址格式的原因,不会有连续的两个 '.' 连着;
                //所以这个位置绝不可能是 '.',所以再加 1,也没问题。
            }
        }
        return s.toString();
    }
}
创建空的 Stringbuilder ,遍历 address 进行 append。

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

c++超100的直接replace解法

class Solution {
public:
    string defangIPaddr(string address) {
        for (int i = 0; i < address.size(); ++i)
        {
            if (address[i] == '.')
            {
                address.replace(i, 1, "[.]");
                // 这个i的偏移量需要+2
                i += 2;
            }
        }

        return address;
    }
};

解题思路 利用有正则表达式功能的re模块,"."在正则表达式中代表除换行符外任意字符,所以用反斜杠转义。


import re
class Solution:
    def defangIPaddr(self, address: str) -> str:
        return re.sub('\.','[.]',address)

解题思路
此题主要考察两个知识点

表层的知识点是简单的字符串替换

隐藏的知识点是考察了在字符串替换中可能需要用到的正则表达式,由于正则表达中 "." 是一个特殊字符,所以在替换IP地址中的 "." 时需要转义。除了 ".",正则表达式中的特殊字符还有 ".$|()[{^?*+\" 等等

解题思路

第一种方法,直接使用replace方法进行替换
第二方方法是对字符串挨个进行判断,如果是.就进行替换

class Solution:
    def defangIPaddr(self, address: str) -> str:
        return address.replace(".","[.]")


class Solution:
    def defangIPaddr(self, address: str) -> str:
        b = ""
        for i in (address):
            if i != ".":
                b = b+i
            else:
                b = b + "[.]"
        return b 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值