劍指offer 學習筆記 字串

2021-10-02 12:25:58 字數 1568 閱讀 8736

c/c++中每個字串以字元』\0』結尾,有時容易出錯:

char str[10]

;strcpy

(str,

"0123456789");

// 出錯

char str1=

"hello world"

;char str2=

"hello world";if

(str1 == str2)

;// false

const

char

*str3 =

"hello world"

;const

char

*str4 =

"hello world";if

(str3 == str4)

;// true

面試題5:替換空格。請實現乙個函式,把字串中的每個空格替換成"%20"。

字串中的乙個空格被替換為三個字元,因此結果原字串會變長,若原字串後還有空間,可以在原串上修改,否則要重新宣告乙個新字串儲存。以下方法使用在原來字串上替換的方式。

方法一:從頭到尾掃瞄字串,遇到空格時把乙個空格替換成三個字元,這就需要把空格後面的字元向後移動兩位元組。假設每個字元的長度是n,對每個空格字元而言,需要移動後面o(n)個字元,因此對於含有o(n)個空格字元的字串,總時間複雜度為o(n²)。顯然這個方法時間複雜度太高。

方法二:我們可以先遍歷一遍字串,統計出字串中空格的總數,由此計算出替換之後的字串的總長度。我們從字串的後面開始複製和替換,首先準備兩個指標p1和p2,p1指向原始串的末尾,而p2指向替換之後的字串的末尾。接下來我們向前移動p1,逐個把它指向的字元複製到p2指向的位置,同時向前移動p2,直到碰到第乙個空格,遇到空格之後,把p1向前移動一格,在p2之前插入字元"%20",同時將p2向前移動三格,之後繼續以上步驟直到p1和p2指向同一位置。此方法所有字元都只移動一次,時間效率為o(n):

#include

using

namespace std;

bool

solution

(char c,

int length)

int newlength =

0, oldlength =0;

char

* cp = c;

while

(*cp !=

'\0'

)else

++cp;}if

(newlength > length)

int oldindex = oldlength -

1, newindex = newlength -1;

while

(oldindex != newindex)

else

--oldindex;

}return

true;}

intmain()

和前面例題一樣,很多人首先想到在a1中從頭到尾排序數字,但這樣會出現乙個數字被移動多次的情況,更好的辦法是從尾到頭比較a1和a2中的數字,並把較大的數字複製到a1中的合適位置。

劍指offer 字串

問題描述 class solution auto res temp.c str strcpy str,res strcpy 關於c 中string和char 的區別參考 問題描述 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0...

劍指offer 字串

問題描述 function replacespace str 問題描述 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含 0 次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a...

劍指offer 字串

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 解這題需要把題意仔細研究清...