面試題【002字符串替換空格】精妙解法

題目描述

請實現一個函數,將一個字符串中的每一個空格替換成「%20」。例如,當字符串爲We Are Happy.則通過替換以後的字符串爲We%20Are%20Happy。面試

解題思路

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

代碼實現

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

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();
}

測試

中間空格ui

[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

開始空格spa

[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

結束空格3d

[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));
}

多空格code

[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));
}

空字符串blog

[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[]

相關文章
相關標籤/搜索