劍指offer 二 字串 cpp

2021-10-02 14:17:31 字數 4332 閱讀 3862

1.替換空格

void

replacespace

(char

*str,

int length)

++originallen;

int newlen = originallen + numofblank*2;

if(newlen>length)

return

;while

(originallen>=

0&& originallen!=newlen)

else

str[newlen--

]= str[originallen]

;--originallen;

}}

2.二進位制中1的個數

輸入乙個整數,輸出該數二進位制表示中1的個數。其中負數用補碼表示。

此處需要重點關注邏輯右移與算術右移的不同性,而邏輯左移與算術左移效果一樣都是在字串末尾新增0,故本題適合使用左移計算

/*法一:常規解法*/

/*法二:規律性解法,詳細見書*/

intnumberof1

(int n)

flag = flag<<1;

|return count;}|

}return count;|}

|

3.正規表示式匹配

請實現乙個函式用來匹配包括』.『和』『的正規表示式。模式中的字元』.『表示任意乙個字元,而』'表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"abaca"匹配,但是與"aa.a"和"ab*a"均不匹配

class

solutionif(

*str==

*pattern ||((

*pattern==

'.')&&(

*str!=

'\0'))

)return

matchcore

(str+

1,pattern+1)

;return

false

;//此處對應各種不匹配現象

}bool

match

(char

* str,

char

* pattern)

};

4.左旋轉字串

組合語言中有一種移位指令叫做迴圈左移(rol),現在有個簡單的任務,就是用字串模擬這個指令的運算結果。對於乙個給定的字串行s,請你把其迴圈左移k位後的序列輸出。例如,字串行s=」abcxyzdef」,要求輸出迴圈左移3位後的結果,即「xyzdefabc」。是不是很簡單?ok,搞定它!

string leftrotatestring

(string str,

int n)

此處以空間的方式,減少了編碼的複雜性,還有書上的原地旋轉演算法,故此處也可以借助stl中的reverse函式,此處附上reverse函式原始碼,需記住的是在c++建構函式等一系列以迭代器作為範圍的皆是左閉右開區間,即[begin,end)

template

<

class

bidirectionaliterator

>

void reverse (bidirectionaliterator first, bidirectionaliterator last)

}

5. 表示數值的字串

請實現乙個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100",「5e2」,"-123",「3.1416"和」-1e-16"都表示數值。但是"12e",「1a3.14」,「1.2.3」,"±5"和"12e+4.3"都不是。

思路:數值字串應該遵循模式a[.[b]][e|ec]或者.b[e|ec],基於此可以思考借助於正規表示式匹配的思路我們將對字串進行分類處理即可。

class

solution

return

*str>before;

}bool

scaninteger

(char

** str)

bool

isnumeric

(char

* string)if(

*string==

'e'||

*string==

'e')

return numeric &&

*string==

'\0';}

};

6.把字串轉換成整數

將乙個字串轉換成乙個整數,要求不能使用字串轉換整數的庫函式。 數值為0或者字串不是乙個合法的數值則返回0。如果是合法的數值表達則返回該數字,否則返回0

int

strtoint

(string str)

for(

;(indexsize()

)&&str[index]

>=

'0'&&str[index]

<=

'9';

++index)

if(index != str.

size()

) res =0;

}return res;

}

7.字串的排列

輸入乙個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

class

solution}}

vector

permutation

(string str)

};

千萬要注意,是按照字典序排序後輸出,故最後要sort一下。

8.第乙個只出現一次的字元

在乙個字串(0<=字串長度<=10000,全部由字母組成)中找到第乙個只出現一次的字元,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫)

int

firstnotrepeatingchar

(string str)

for(

int i=

0;ilength()

;++i)

return-1

;}

9.翻轉單詞順序列
class

solution

if(str[i]

=='.'

||str[i]

=='!'

||str[i]

=='?')}

if(flag)

reverse

(str.

begin()

,str.

end())

;return str;}}

;

10.整數中1出現的次數(從1到n整數中1出現的次數)

求出113的整數中1出現的次數,並算出1001300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 到 n 中1出現的次數)。

解法一:最弱的方法,o(nlogn)

int

numberof1between1andn_solution

(int n)

}return count;

}

解法二:總結之後解法,o(logn),良心

class

solution

return res;

}int

numberof1

(string& str,

int index)

int numotherdigit = first*

(length-1)

*powerbase10

(length-2)

;int numrecursive =

numberof1

(str,index+1)

;return numfirstdigit+numotherdigit+numrecursive;

}int

numberof1between1andn_solution

(int n)

};

劍指offer系列之二 字串空格替換

看到這題,我的第一思路是這樣的 一組單詞不是有空格嘛,所以直接使用string類的split函式直接分割為char陣列不就好了,不過在這之前需要判斷一下第乙個位置和最後乙個位置是否有空格,然後針對空格的出現情況再進行替換。發現oj的時候,如你所猜,自然是失敗的。因為我忽略乙個問題,就是如果乙個句子中...

劍指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...