C#算法實現(xiàn)字符串反轉(zhuǎn)淺析
讓我們來看看C#算法實現(xiàn)字符串反轉(zhuǎn)的一道面試題,使用C#實現(xiàn)字符串反轉(zhuǎn)算法。
C#算法實現(xiàn)字符串反轉(zhuǎn)詳細(xì)內(nèi)容如下:
- ///<summary>
- ///使用C#字符串反轉(zhuǎn)算法
- /// e.g. 輸入"12345", 輸出"54321"
- ///請使用你認(rèn)為的最優(yōu)算法
- ///</summary>
- ///<param name="s">input string</param>
- ///<returns>output string</returns>
- public static string Reverse(string str)
- {
- }
- ///<summary>
- ///使用C#字符串反轉(zhuǎn)算法
- /// e.g. 輸入"12345", 輸出"54321"
- ///請使用你認(rèn)為的最優(yōu)算法
- ///</summary>
- ///<param name="s">input string</param>
- ///<returns>output string</returns>
- public static string Reverse(string str)
- {
- }
這兩周看到了很多同學(xué)的回答,這里給出一些自己的建議,希望能對各位同學(xué)有用。
C#算法實現(xiàn)字符串反轉(zhuǎn)常見問題:
1. 面試算法題慣例是寫一個函數(shù),所以如果是在Main函數(shù)中完成的,或者只是將接受的字符串倒序輸出的,可以說沒有函數(shù)的思維,基本肯定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();
- }
- 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. 同上,很多同學(xué)在方法中進(jìn)行輸入和輸出,這個還是沒有函數(shù)的思維。最簡單的道理,大多數(shù)功能性函數(shù)的功能就是通過參數(shù)返回結(jié)果,類似上面的代碼,如果其他開發(fā)人員是在Web應(yīng)用程序中調(diào)用這個函數(shù),你的結(jié)果卻是在控制臺輸出,那誰能看見結(jié)果呢?而且我只是說要輸出的字符串,沒說要輸出啊,你這都輸出了,調(diào)用者如果想自己控制輸出怎么辦?(除非是做某些測試有時會在方法里進(jìn)行輸出到Log),在面試中如果寫出這樣的代碼基本也over.
3. 對參數(shù)的檢查。這個不是最重要的,但很重要。算法題按慣例是要對參數(shù)的進(jìn)行一些必要的檢查的(如果是面試測試人員,對細(xì)節(jié)的考察就更重要了),而且請注意,我們可以拋出異常,讓調(diào)用者來決定如何處理異常。
4. 一般大公司的面試算法題,很少會讓你調(diào)用類庫的函數(shù)的(默認(rèn)值)。這個題目如果就是調(diào)用Array.Reverse()完成的,肯定over。
最后,這道題目考察的其實就是很多人容易犯的錯誤,也是C#面試中的一個常見考點:String類與StringBuilder類的區(qū)別。所以只要代碼中出現(xiàn)在循環(huán)中string類的對象疊加的代碼,基本over。
比如下面這種:
- static string Reverse(string str)
- {
- string strReturn = "";
- foreach (char c in str)
- {
- strReturn = c + strReturn;
- }
- return strReturn;
- }
- static string Reverse(string str)
- {
- string strReturn = "";
- foreach (char c in str)
- {
- strReturn = c + strReturn;
- }
- return strReturn;
- }
當(dāng)使用StringBuilder時,請注意,應(yīng)在構(gòu)造StringBuilder對象時指明初始容量,否則默認(rèn)容量是16個字符,當(dāng)由于追加字符而超出默認(rèn)容量時,就會分配一個新的串緩沖區(qū),大小是原緩沖區(qū)的兩倍。
C#算法實現(xiàn)字符串反轉(zhuǎn)參考答案:
- public static string Reverse(string str)
- {
- if (string.IsNullOrEmpty(str))
- {
- throw new ArgumentException("參數(shù)不合法");
- }
- StringBuilder sb = new StringBuilder(str.Length);
- for (int index = str.Length - 1; index >= 0; index--)
- {
- sb.Append(str[index]);
- }
- return sb.ToString();
- }
- public static string Reverse(string str)
- {
- if (string.IsNullOrEmpty(str))
- {
- throw new ArgumentException("參數(shù)不合法");
- }
- StringBuilder sb = new StringBuilder(str.Length);
- for (int index = str.Length - 1; index >= 0; index--)
- {
- sb.Append(str[index]);
- }
- return sb.ToString();
- }
有些同學(xué)使用char數(shù)組,我認(rèn)為也可
- public static string Reverse(string str)
- {
- if (string.IsNullOrEmpty(str))
- {
- throw new ArgumentException("參數(shù)不合法");
- }
- 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;
- }
- public static string Reverse(string str)
- {
- if (string.IsNullOrEmpty(str))
- {
- throw new ArgumentException("參數(shù)不合法");
- }
- 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;
- }
C#算法實現(xiàn)字符串反轉(zhuǎn)的基本情況就向你介紹到這里,希望通過一道試題使你了解C#字符串反轉(zhuǎn)算法的使用和C#算法。
【編輯推薦】