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