關於一道面試題,使用C#實現字符串反轉算法。
題目見http://student.csdn.net/space.php?do=question&ac=detail&qid=490
詳細內容如下:
- ///<summary>
- ///使用C#實現字符串反轉算法
- /// e.g. 輸入"12345", 輸出"54321"
- ///請使用你認為的最優算法
- ///</summary>
- ///<param name="s">input string</param>
- ///<returns>output string</returns>
- public static string Reverse(string str)
- {
- }
這兩周看到了很多同學的回答,這里給出一些自己的建議,希望能對各位同學有用。
常見問題:
1. 面試算法題慣例是寫一個函數,所以如果是在Main函數中完成的,或者只是將接受的字符串倒序輸出的,可以說沒有函數的思維,基本肯定over.
比如下面這種:
- static void Main(string[] args)
- {
- Console.WriteLine("請輸入一個字符串!");
- string sString = Console.ReadLine();
- for (int i = sString.Length - 1; i >= 0; i--)
- {
- Console.Write(sString.Substring(i, 1));
- }
- Console.ReadLine();
- }
2. 同上,很多同學在方法中進行輸入和輸出,這個還是沒有函數的思維。最簡單的道理,大多數功能性函數的功能就是通過參數返回結果,類似上面的代碼,如果其他開發人員是在Web應用程序中調用這個函數,你的結果卻是在控制台輸出,那誰能看見結果呢?而且我只是說要輸出的字符串,沒說要輸出啊,你這都輸出了,調用者如果想自己控制輸出怎么辦?(除非是做某些測試有時會在方法里進行輸出到Log),在面試中如果寫出這樣的代碼基本也over.
3. 對參數的檢查。這個不是最重要的,但很重要。算法題按慣例是要對參數的進行一些必要的檢查的(如果是面試測試人員,對細節的考察就更重要了),而且請注意,我們可以拋出異常,讓調用者來決定如何處理異常。
4. 一般大公司的面試算法題,很少會讓你調用類庫的函數的(默認值)。這個題目如果就是調用Array.Reverse()完成的,肯定over。
最后,這道題目考察的其實就是很多人容易犯的錯誤,也是C#面試中的一個常見考點:String類與StringBuilder類的區別。所以只要代碼中出現在循環中string類的對象疊加的代碼,基本over。
比如下面這種:
- static string Reverse(string str)
- {
- string strReturn = "";
- foreach (char c in str)
- {
- strReturn = c + strReturn;
- }
- return strReturn;
- }
當使用StringBuilder時,請注意,應在構造StringBuilder對象時指明初始容量,否則默認容量是16個字符,當由於追加字符而超出默認容量時,就會分配一個新的串緩沖區,大小是原緩沖區的兩倍。
以下是參考答案:
- public static string Reverse(string str)
- {
- if (string.IsNullOrEmpty(str))
- {
- throw new ArgumentException("參數不合法");
- }
- StringBuilder sb = new StringBuilder(str.Length);
- for (int index = str.Length - 1; index >= 0; index--)
- {
- sb.Append(str[index]);
- }
- return sb.ToString();
- }
有些同學使用char數組,我認為也可
- public static string Reverse(string str)
- {
- if (string.IsNullOrEmpty(str))
- {
- throw new ArgumentException("參數不合法");
- }
- char[] chars = str.ToCharArray();
- int begin = 0;
- int end = chars.Length - 1;
- char tempChar;
- while (begin < end)
- {
- tempChar = chars[begin];
- chars[begin] = chars[end];
- chars[end] = tempChar;
- begin++;
- end--;
- }
- string strResult = new string(chars);
- return strResult;
- }
批改題目時部分同學的評判有誤,請見諒!
這里有更詳盡的探討,請參考
http://www.cnblogs.com/kirinboy/archive/2010/04/23/reverse-a-string.html