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 均不匹配 解這題需要把題意仔細研究清...