題目描述 請實現一個函數,將一個字元串中的每個空格替換成“%20”。例如,當字元串為We Are Happy.則經過替換之後的字元串為We%20Are%20Happy。 解題思路 老實說,看到這個題目想到的就是字元串替換,但是面試題肯定不是這麼簡單的,那麼怎麼在原字元串上進行高效的替換呢?我們的字元 ...
題目描述
請實現一個函數,將一個字元串中的每個空格替換成“%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