清除IP地址Leetcode解決方案


難度級別 容易獎學金
經常問 亞馬遜
字符串緩衝區

問題陳述

在此問題中,我們獲得了一個IP地址。 我們只需要將其轉換為Defanged IP地址,即在我們的輸出字符串中將所有“。” 轉換為“ [。]”。

清除IP地址Leetcode解決方案

#1:

address = "1.1.1.1"
"1[.]1[.]1[.]1"

#2:

address = "255.100.50.0"
"255[.]100[.]50[.]0"

方法1(使用字符串流/構建器)

對於此問題,我們可以使用簡單的字符串流或構建器類來修改給定的字符串。
我們可以使用 字符串生成器 (對於Java)和字符串流(對於C ++),用於將給定的字符串轉換為輸出字符串。
我們將從左到右遍歷輸入字符串。 如果有任何字符為“。” 然後,我們將在輸出字符串中附加“ [。]”。 否則,我們也將字符簡單地附加在輸出字符串中。

算法

  • 創建一個空的字符串流或構建器。
  • 運行for循環遍歷給定字符串的每個字符。
  • 對於字符串中的每個字符。 如果字符是“。” 然後將“ [。]”附加到字符串生成器。 否則,將相同字符附加到字符串生成器。
  • 將流/生成器轉換為字符串並返回。

消除IP地址Leetcode解決方案的實現

C ++程序

#include <iostream>
#include <sstream>
using namespace std;
string defangIPaddr(string address) 
{
    std::stringstream ss;

    for(int i=0;i<address.length();i++){
        if(address[i]=='.'){
            ss<<"[.]";//replacing . with [.]
        }else{
            ss<<address[i];
        }
    }
    return ss.str();
}

int main()
{
    cout << defangIPaddr("1.1.1.1");
}
1[.]1[.]1[.]1

Java程序

import java.util.*;
import java.lang.*;

class Solution
{  
    public static 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();
    }
    
    public static void main(String args[])
    {
        System.out.println(defangIPaddr("1.1.1.1"));
    }
}
1[.]1[.]1[.]1

分解IP地址Leetcode解決方案的複雜度分析

時間複雜度

上) : 我們正在線性遍歷給定的字符串,因此它是O(n)。

空間複雜度 

上) : 在Java的情況下,我們使用的是線性額外空間的字符串生成器;在C ++的情況下,我們使用的是字符串流,因此空間複雜度為O(n)。

方法2(使用內置功能)

我們將在C ++中使用正則表達式替換函數,並在Java中替換所有函數:

我們可以使用C ++的regex_replace函數來替換所有的“。” 至 ”[。]”。
另外,在Java的情況下,我們可以使用replaceAll()函數替換所有“。” 至 ”[。]”。

消除IP地址Leetcode解決方案的實現

C ++程序

#include <iostream>
#include <regex>
using namespace std;
string defangIPaddr(string address) 
{
        return regex_replace(address, regex("[.]"), "[.]");
    //. is covered by [] from both sides because . itself works as pipe and will give wrong result if not used like [.] 
}

int main()
{
    cout << defangIPaddr("1.1.1.1");
}
1[.]1[.]1[.]1

Java程序

import java.util.*;
import java.lang.*;

class Solution
{  
    public static String defangIPaddr(String address) 
    {
        /*
        A period (.) has a special meaning there as does a pipe (|) as does a curly brace (}).       
        You need to escape them all using // before '.'.
        */
        return address.replaceAll("\\.","[.]");
    }
    
    public static void main(String args[])
    {
        System.out.println(defangIPaddr("1.1.1.1"));
    }
}
1[.]1[.]1[.]1

分解IP地址Leetcode解決方案的複雜度分析

時間複雜度

時間複雜度將取決於預定義功能的內部實現。

空間複雜度 

空間複雜度還將取決於預定義功能的內部實現。