劍指Offer 面試題四 替換空格

2021-07-11 21:58:41 字數 2958 閱讀 7712

c/c++把常量字串放到單獨的乙個記憶體區域。當幾個

指標賦值給相同的常量字串時,它們實際上會指向相同的記憶體位址。但是用常量記憶體初始化陣列,情況卻不相同。

**如下:

#includeusing namespace std;

int main()

執行結果:

same

no same

請按任意鍵繼續. . .

分析:

ch1和ch2是兩個指標,我們無需為它們分配記憶體以儲存字串內容,而只需要把它們指向「abcd」在記憶體中的位址就可以了。由於「abcd」是常量字串,它在記憶體中只有乙個拷貝,因此ch1和ch2指向的是同乙個位址。

ch3和ch4是兩個字串陣列,我們會為它們分別分配兩個長度為5個位元組的空間,並把「abcd」的內容分別複製到陣列中去,這是兩個初始位址不同的陣列,因此ch1和ch2的值也不相同。

利用string

源**:

#include#include#includeusing std::cout;

using std::endl;

using std::find;

using std::string;

int main()

cout << str << endl;

system("pause");

return 0;

}

輸出結果:

請按任意鍵繼續. . .

遍歷字串,沒找到乙個空格,將空格替換為「%20」,並將後邊的字元向後移動兩個位置。

先統計字串中空格的數目並計算替換之後字串的總長度,每替換乙個空格,字元長度增加2,因此替換之後的長度等於原始長度+空格數*2.

(a)把第乙個指標指向字串的末尾,把第二個指標指向替換之後的字串的末尾

(b)依次賦值字串中的內容,直至第乙個指標碰到第乙個空格

(c)把第乙個空格替換成「%20」,把第乙個指標向前移動1格,把第二個指標向前移動3格

(d)依次向前賦值字串中的字元,直至碰到空格

(e)替換字串中的倒數第二個空格,把第乙個指標向前移動1格,把第二個指標向前移動3格

源**:

#include#include//malloc

using std::cout;

using std::endl;

void replace(char *ch)

char *temp = (char *)malloc((len + count * 2)*sizeof(char));//分配新的空間

for (int i = 0; i < len; i++)//將ch中的內容複製到新分配的空間

temp[i] = ch[i];

char *p1 = temp + len - 1;//指向ch的最後乙個字元'\n'

char *p2 = temp + len + count * 2 - 1;//指向新分配空間的最後乙個字元空間

while (p1 != p2)

else

}cout << temp << endl;

}int main()

執行結果:

%20%20%20we%20%20

請按任意鍵繼續. . .

官方源**:

//// 《劍指offer——名企面試官精講典型程式設計題》**

// 著作權所有者:何海濤

#include #include /*length 為字元陣列string的總容量*/

void replaceblank(char string, 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; }}

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 main3()

測試用例:

輸入的字串包含空格(空格位於字串最前面,空格位於字串的最後面,空格位於字串中間,字串中有連續多個空格)

輸入的字串中沒有空格

特殊輸入測試(字串中十個null指標、字串十個空字串、字串中只有乙個空格字元,字串中只有連續多個空格)

劍指offer面試題 替換空格

題目 請實現乙個函式,把字串中的每個空格替換成 20 例如輸入 則輸出 解析 時間複雜度為o n 的解法。完整 及測試用例實現 cpp view plain copy include using namespace std include length 為字元陣列string的總容量 void re...

替換空格(劍指offer面試題4)

分析 從頭到尾掃瞄字串,遇到空格就替換,導致後面的字元都要向後移,意味著總時間複雜度為o n 2 更好的辦法,從字串後面遍歷替換。先遍歷所有的空格,每多乙個空格,字串長度加2個,也就是說最後替換後的字串長度為原長度 2 空格數,設定兩個指標,指向原始字串末尾和新字串末尾,依次向前遍歷,原始字串指標遇...

劍指offer 面試題 (替換空格) 1

題目分析 首先,我們應該想到的是原來是乙個空格字元,替換之後變為三個字元 2 0 如果我們直接在原來的字串上進行替換,就有可能覆蓋掉原本的內容 如果是建立新的字串並 新的字串上做替換,那麼我們可以自己分配好足夠的記憶體,所以我們應該向面試官問清楚如果面 試官告訴你在原本的字串上做修改,並且記憶體足夠...