字符串替換空格


題目描述

請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串為We Are Happy.則經過替換之后的字符串為We%20Are%20Happy。

解題思路

老實說,看到這個題目想到的就是字符串替換,但是面試題肯定不是這么簡單的,那么怎么在原字符串上進行高效的替換呢?我們的字符串替換,主要的消耗是在移位上,每遇到一個空格,后面的字符串就往后移位,那么之前的移位都沒有作用了。我們知道字符串的長度,知道替換字符串的長度,如果還知道空格的多少,那么這個字符串的長度就知道了。知道長度之后,只需要把數據放到響應的位置就可以了。
步驟:
1. 遍歷字符串,統計出空格數量
2. 再遍歷一次,完成替換

代碼實現

普通解法,直接替換字符串

public static string ReplaceSpaceForSimple(string str)
{
    return str.Replace(" ", "%20");
}

精妙解法數據移位

public static string ReplaceSpace(string str)
{
    int count = 0;
    foreach (var item in str)
    {
        if (item == ' ')
        {
            count++;
        }
    }

    int oLength = str.Length;
    int length = oLength + count * 2; //"%20".Length-1
    char[] tempArray = new char[length]; //新開辟了一個空間
    length--;
    for (int i = oLength - 1; i >= 0; i--)
    {
        if (str[i] == ' ')
        {
            tempArray[length--] = '0';
            tempArray[length--] = '2';
            tempArray[length--] = '%';
        }
        else
        {
            tempArray[length--] = str[i];
        }
    }

    return new string(tempArray);
}

賦值給另外一個

public static string ReplaceForBS(string str) {
    StringBuilder sb = new StringBuilder();
    foreach (var item in str) {
        if (item == ' ')
        {
            sb.Append("%20");
        }
        else {
            sb.Append(item);
        }
    }
    return sb.ToString();
}

測試

中間空格

[Fact]
public void Middle()
{
    string str = "We Are Happy.";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}
View Code

開始空格

[Fact]
public void Start()
{
    string str = " We Are Happy.";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}
View Code

結束空格

[Fact]
public void End()
{
    string str = "We Are Happy. ";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}

多空格

[Fact]
public void More()
{
    string str = "We     Are  Happy.";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}

空字符串

[Fact]
public void Empty()
{
    string str = "";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));

    str = " ";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));

    str = "  ";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}
View Code

結果

想入非非:擴展思維,發揮想象

1. 這個題可以擴展為替換其他的數據,不要局限於單一的替換,URL就是ASCII替換
2. 字符串是一種特殊的char[]

3. 熟悉字符串string,stringbuilder


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM