分析:我們從字串的後面開始複製和替換。首先準備兩個指標,p1和p2。p1指向原始字串的末尾,而p2指向替換之後的字串的末尾(如圖(a)所示)。接下來我們向前移動指標p1,逐個把它指向的字元複製到p2指向的位置,直到碰到第乙個空格為止。此時字串包含如圖(b)所示,灰色背景的區域是做了字元拷貝(移動)的區域。碰到第乙個空格之後,把pl向前移動1格,在p2之前插入字串"%20"。由於"%20"的長度為3,同時也要把p2向前移動3格如圖(c)所示。
我們接著向前複製,直到到碰到第二個空格(如圖2.4(d)所示)。和上次一樣,我們再把p1向前移動1格,並把p2向前移動3格插入"%20"(如圖2.4(e)所示)。此時p1和p2指向同一位置,表明所有空格都已經替換完畢。 從上面的分析我們可以看出,所有的字元都只複製(移動)一次,因此這個演算法的時間效率是o(n),效率比較高。
注:圖中帶有陰影的區域表示被移動的字元。
(a)把第乙個指標指向原字串的末尾,把第二個指標指向替換之後的字串的末尾。
(b)依次複製字串的內容,直至第乙個指標碰到第乙個空格。
(c)把倒數第乙個空格
替換成"%20",接著,把第乙個指標向前移動1格,把第二個指標向前移動3格。
(d)依次向前複製字串中的字元,直至碰到空格。
(e)替換字串中的倒數第二個空格,接著,把第乙個指標向前移動1格,把第二個指標向前移動3格。
在面試的過程中,我們也可以和前面的分析一樣,畫一兩個示意圖,解釋自己的思路,這樣既能幫助我們理清思路,也能使我們和面試官的交流變得更加高效。在面試官肯定我們的思路之後,就可以開始寫**了。下面是參考**:
//length為字元陣列string的總容量
void replaceblank(char str,int length)
//newlength為把空格替換成'%20'之後的長度
int newlength=originallength + numberofblank*2;
if(newlength>length)
return;
int indexoforiginal=originallength;
int indexofnew=newlength;
while (indexoforiginal>=0 && indexofnew>indexoforiginal)
else
--indexoforiginal;
}}
測試用例:
1)輸入的字串中
包含空格(空格位於字串的
最前面,空格位於字串的
最後面,空格位於字串的
中間,字串中有
連續多個空格)。
2)輸入的字串中
沒有空格。
3)特殊輸入測試(字串是個null指標、字串是個空字串、字串只有乙個空格字元、字串中只有連續多個空格)。
//測試**:
void test(char* testname, char string, int length, char expected)
// 空格在句子中間
void test1()
// 空格在句子開頭
void test2()
// 空格在句子末尾
void test3()
// 連續有兩個空格
void test4()
// 傳入null
void test5()
// 傳入內容為空的字串
void test6()
//傳入內容為乙個空格的字串
void test7()
// 傳入的字串沒有空格
void test8()
// 傳入的字串全是空格
void test9()
//主函式
int _tmain(int argc, _tchar* argv)
效果如下:
字串中的替換空格
題目 把字串中的每個空格替換成 20 思路 直觀的做法是從頭到尾掃瞄字串,遇到空格就做替換,然而由於將乙個字元替換成3個字元,我們必須將空格後面的所有字元都後移兩個位元組。這樣沒次遇到空格,都會移動字元。對於這種問題,當字串 或陣列 長度變大,從前往後操作時移動次數多時,可以考慮從後往前操作。ps ...
替換字串中的空格
這是乙個關於字串的題目,解決這個問題有如下方法。最直觀的方法,利用輔助空間,開始遍歷原字串,是空格則在輔助空間中用 20 字串替代,不是則直接複製到輔助空間中。此方法時間複雜度為o n 空間複雜度為o n 因為需要遍歷原字串,所以時間複雜度不能縮減。如果考慮空間複雜度為o 1 有一種從空間複雜度概念...
替換字串中的空格
替換字串中的空格的方法有很多,在這裡我們實現一種時間複雜度與空間複雜度都為o n 的方法,使用c 語言實現。例如字串talk is cheap show me the code,我們要將其替換為talk is cheap show me the code,並且列印到螢幕上。方 述 定義乙個字元型指標...