劍指offer之字串

2021-10-01 21:42:59 字數 4845 閱讀 3729

目錄

面試題5:替換空格

面試題19:正規表示式匹配

面試題20:表示數值的字串

面試題38:字串的排列

面試題48:最長不含重複字元的子字串

面試題50:第乙個只出現一次的字元

拓展:字元流中第乙個不重複的字元

面試題58:翻轉單詞順序

拓展:左旋轉字串

面試題61:撲克牌中的順子

面試題67:把字串轉換成整數

分析:先遍歷一次字串,統計出字串中空格的總數。然後從字串的後面開始替換和複製,準備兩個指標,乙個指向原始字串的末尾,乙個指向替換之後的字串末尾。

public string replacespace(stringbuffer str) 

int i = str.length() - 1;

int j = str.length() + count * 2;

str.setlength(j);

j--;

while(i != j)

else

str.setcharat(j--,str.charat(i));

i--;

}return string.valueof(str);

}

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

分析:當模式中第二個字元不是『*』的情況,就看當前字元是否匹配即可;當模式中第二個字元為『*』,可以在模式中向後移兩個字元(匹配0個字元),如果當前字元匹配,則在字串中向後移乙個字元,模式上可以向後移動兩個字元,也可以保持模式不變。

public boolean match(char str, char pattern) 

private boolean matchcore(char str, int i, char pattern, int j)

if(j+1 < pattern.length && pattern[j+1] == '*')

if(i < str.length && (str[i] == pattern[j] || pattern[j] == '.'))

return matchcore(str,i+1,pattern,j+1);

return false;

}

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

分析:表示數值的字串遵循模式a[.[b]][e|ec]或者.[b]][e|ec],其中a為數值的整數部分,b緊跟小數點為數值的小數部分,c為數值的指數部分。在小數里可能沒有數值的整數部分,如.123;其中a和c都可能有正負號。

public boolean isnumeric(char str) 

// 判斷e後面的c

if (index[0] < str.length && (str[index[0]] == 'e' || str[index[0]] == 'e'))

if (isnumeric && index[0] == str.length)

return true;

else

return false;

}private boolean isinteger(char str, int index)

private boolean isunsignedinteger(char str, int index)

題目:輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。

分析:求全排列分成兩步。第一步求所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有的字元交換;第二步固定第乙個字元,求後面所有字元的排列。特別注意字串中可能有重複字母且結果要求按字典順序列印,可用treeset進行篩選和排序。

public arraylistpermutation(string str) 

private void permutation(char str, int index,treesetresult)

}

題目:請從字串中找出乙個最長的不包含重複字元的子字串,計算該最長子字串的長度。假設字串中只包含』a』~'z』的字元。例如,在字串"arabcacfr"中,最長的不含重複字元的子字串就是"acfr",長度為4。

分析:動態規劃。首先定義函式f(i)表示以第i個字元為結尾的不含重複字元的最長長度。我們從左到右逐一掃瞄子字串中的每個字元,如果當前字元之前沒有出現過,那麼f(i) = f(i-1) + 1;如果當前字元在之前出現過,我們先計算第i個字元和它上次出現過在字串中的位置的距離,並記為d,接著分兩種情況:當d <= f(i-1),也就是說上次出現在f(i-1)對應的最長子字串中,那麼f(i) = d;反之當d > f(i-1),此時第i個字元上次出現在f(i-1)對應的最長子字串之前,那麼f(i) = f(i-1) + 1。

public int lengthoflongestsubstring(string s) 

position[s.charat(i) - 'a'] = i;

}if(maxlen < curlen)

maxlen = curlen;

return maxlen;

}

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

分析:定義雜湊表的鍵值為字元,值為該字元出現的次數。同時還要從頭掃瞄字串兩次,第一次統計各字元出現的次數,第二次得到第乙個只出現一次的字元。該方法的時間效率和空間效率分別為o(n) 和 o(1).

public int firstnotrepeatingchar(string str) 

}for(int i = 0;i < str.length();i++)

if(map.get(str.charat(i)) == 1)

return i;

return -1;

}

題目:請實現乙個函式用來找出字元流中第乙個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第乙個只出現一次的字元是"g"。當從該字元流中讀出前六個字元「google"時,第乙個只出現一次的字元是"l"。

分析:用乙個list來存放字元,雜湊表來存放每個字元所出現的次數即可。

hashmapmap = new hashmap();// 存放字元和其出現的次數

arraylistlist = new arraylist();// 存放字元

public void insert(char ch)

}for(character c:list)

return '#';

}

題目:輸入乙個英文句子,翻轉句子中單詞的順序,但單詞內字元的順序不變。例如輸入「i am a student.」,輸出「student. a am i」。

分析:先翻轉整個句子,再翻轉句子中的每個單詞即可。

題目:對於乙個給定的字串行s,請你把其迴圈左移k位後的序列輸出。例如,字串行s=」abcxyzdef」,要求輸出迴圈左移3位後的結果,即「xyzdefabc」。

分析:先分別翻轉這兩個部分,再翻轉整個字串即可。

題目:從撲克牌中隨機抽5張牌,判斷是不是乙個順子,即這5張牌是不是連續的。2~10為數字本身,a為1,j為11,q為12,k為13,而大、小王可以看成任意數字。為了方便起見,可以認為大小王是0。

分析:首先把陣列排序,其次統計陣列中0的個數以及相鄰數字的空缺數,注意如果相鄰兩個數相等那麼也不可能是順子。

public boolean iscontinuous(int  numbers) 

if(zero >= gap)

return true;

else

return false;

}

題目:將乙個字串轉換成乙個整數,要求不能使用字串轉換整數的庫函式。 數值為0或者字串不是乙個合法的數值則返回0

分析:需要將空指標、空字串、正負號、溢位等方方面面的測試用例考慮到。注意需要用全域性變數來區分 數值為0或者字串不是乙個合法的數值兩種情況。測試用例:1a0,00001,+

public int strtoint(string str) 

while(i < s.length() && s.charat(i) == '0')

i++;

for(;i < s.length();i++)

if(result > integer.max_value/10 || (result == integer.max_value/10 && c>'7'))

return 0;

if(result < integer.min_value/10 || (result ==integer.min_value/10 && c>'8'))

return 0;

result = result * 10 + (c - '0') * flag;

}return result;

}

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