關於一道面試題,使用C#實現字符串反轉算法


關於一道面試題,使用C#實現字符串反轉算法。

題目見http://student.csdn.net/space.php?do=question&ac=detail&qid=490

 

詳細內容如下:

[c-sharp]  view plain copy
 
  1. ///<summary>  
  2. ///使用C#實現字符串反轉算法  
  3. /// e.g. 輸入"12345", 輸出"54321"  
  4. ///請使用你認為的最優算法  
  5. ///</summary>  
  6. ///<param name="s">input string</param>  
  7. ///<returns>output string</returns>  
  8. public static string Reverse(string str)  
  9. {  
  10.   
  11. }  

 

 

這兩周看到了很多同學的回答,這里給出一些自己的建議,希望能對各位同學有用。

 

常見問題:

1. 面試算法題慣例是寫一個函數,所以如果是在Main函數中完成的,或者只是將接受的字符串倒序輸出的,可以說沒有函數的思維,基本肯定over.

比如下面這種:

[c-sharp]  view plain copy
 
  1. static void Main(string[] args)  
  2. {  
  3.     Console.WriteLine("請輸入一個字符串!");  
  4.     string sString = Console.ReadLine();  
  5.     for (int i = sString.Length - 1; i >= 0; i--)  
  6.     {  
  7.         Console.Write(sString.Substring(i, 1));  
  8.     }  
  9.     Console.ReadLine();  
  10. }  

 

 

2. 同上,很多同學在方法中進行輸入和輸出,這個還是沒有函數的思維。最簡單的道理,大多數功能性函數的功能就是通過參數返回結果,類似上面的代碼,如果其他開發人員是在Web應用程序中調用這個函數,你的結果卻是在控制台輸出,那誰能看見結果呢?而且我只是說要輸出的字符串,沒說要輸出啊,你這都輸出了,調用者如果想自己控制輸出怎么辦?(除非是做某些測試有時會在方法里進行輸出到Log),在面試中如果寫出這樣的代碼基本也over.

 

3. 對參數的檢查。這個不是最重要的,但很重要。算法題按慣例是要對參數的進行一些必要的檢查的(如果是面試測試人員,對細節的考察就更重要了),而且請注意,我們可以拋出異常,讓調用者來決定如何處理異常。

 

4. 一般大公司的面試算法題,很少會讓你調用類庫的函數的(默認值)。這個題目如果就是調用Array.Reverse()完成的,肯定over。

最后,這道題目考察的其實就是很多人容易犯的錯誤,也是C#面試中的一個常見考點:String類與StringBuilder類的區別。所以只要代碼中出現在循環中string類的對象疊加的代碼,基本over。

比如下面這種:

 

[c-sharp]  view plain copy
 
  1. static string Reverse(string str)  
  2. {  
  3.     string strReturn = "";  
  4.     foreach (char c in str)  
  5.     {  
  6.         strReturn = c + strReturn;  
  7.     }  
  8.     return strReturn;  
  9. }  

 

 

當使用StringBuilder時,請注意,應在構造StringBuilder對象時指明初始容量,否則默認容量是16個字符,當由於追加字符而超出默認容量時,就會分配一個新的串緩沖區,大小是原緩沖區的兩倍。

以下是參考答案:

 

[c-sharp]  view plain copy
 
  1. public static string Reverse(string str)   
  2. {   
  3.     if (string.IsNullOrEmpty(str))   
  4.     {   
  5.         throw new ArgumentException("參數不合法");   
  6.     }   
  7.   
  8.     StringBuilder sb = new StringBuilder(str.Length);   
  9.     for (int index = str.Length - 1; index >= 0; index--)   
  10.     {   
  11.         sb.Append(str[index]);   
  12.     }   
  13.     return sb.ToString();   
  14. }  

 

 

有些同學使用char數組,我認為也可

 

[c-sharp]  view plain copy
 
  1. public static string Reverse(string str)   
  2. {   
  3.     if (string.IsNullOrEmpty(str))   
  4.     {   
  5.         throw new ArgumentException("參數不合法");   
  6.     }  
  7.   
  8.     char[] chars = str.ToCharArray();  
  9.     int begin = 0;  
  10.     int end = chars.Length - 1;  
  11.     char tempChar;  
  12.     while (begin < end)  
  13.     {  
  14.         tempChar = chars[begin];  
  15.         chars[begin] = chars[end];  
  16.         chars[end] = tempChar;  
  17.         begin++;  
  18.         end--;  
  19.     }  
  20.   
  21.     string strResult = new string(chars);  
  22.   
  23.     return strResult;   
  24. }  

 

 

批改題目時部分同學的評判有誤,請見諒!

 

這里有更詳盡的探討,請參考

http://www.cnblogs.com/kirinboy/archive/2010/04/23/reverse-a-string.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM