字符串反轉是面試過程中出現頻率較高的算法題,今天一個牛同事讓我用C#幫他實現這個算法,前提當然是不能使用類庫。
例如: how are you 的反轉結果為 you are how.
算法1: 是我當場寫的一個不太理想的算法,雖然不太理想,但思路很直接:
1. 申請一個新的字符數組,新字符數組大小與源字符串等長度。
2. 將源字符串從末尾向前端進行遍歷。將每一個單詞加入新字符數組。
使用變量count記錄當前單詞長度。即,
若字符非空格,count++;
若字符是空格,則將原數組從當前位置開始的count個字符加入到新數組中。
static void Main(string[] args) { string testString = "how are you"; var result = reverseString(testString); } static char[] reverseString(string value) { if (string.IsNullOrEmpty(value)) return new char[] { }; int length = value.Length; char[] result = new char[length]; int count = 0; int rIndex = 0; for (int i = length-1; i>=0; i--) { if(value[i]!=' ') { count++; } if(value[i]==' ') { int index = i + 1; for(; index< i+count+1; index++) { result[rIndex++] = value[index]; } count = 0; result[rIndex++] = ' '; } } // fot the first word foreach (char c in value) { if (c != ' ') result[rIndex++] = c; else break; } return result; } }
算法2: 今天下班前,又花了1個小時重新考慮了這個問題,其實要實現空間開銷最小,時間復雜度最低,可以實現一個字符數組反轉程序。 思路如下:
1. 先將整個元字符數組反轉, 得到 uoy era woh.
2. 再將每個單詞進行反轉, 同樣使用空字符分割單詞。
注意:字符數組反轉函數,1. 不需要遍歷所有字符,僅僅遍歷二分之一的字符即可。 2. 用left, right控制字符數組中反轉字符的起始位置。

namespace reverseWords { /// <summary> /// Qijie Xue /// </summary> class Program { static void Main(string[] args) { string testData = "how are you now"; var result = reverseString2(testData); } static char[] reverseString2(string value) { char[] ochr = value.Trim().ToString().ToArray(); ochr = reverseChar(ref ochr, 0, ochr.Length - 1); int start = 0; int end = 0; for(int i = 0; i<ochr.Length; i++) { if(ochr[i]==' ') { end = i - 1; reverseChar(ref ochr, start, end); start = i + 1; } if(i==ochr.Length - 1) { end = ochr.Length - 1; reverseChar(ref ochr, start, end); } } return ochr; } static char[] reverseChar(ref char[] ochr, int left, int right) { int mid = (right + left) >> 1; int l = 0; int r = 0; //even numbers, l = mid, r = mid + 1 //odd numbers, l = mid - 1, r = mid + 1 if ((right - left + 1) % 2 == 0) { l = mid + 1; r = mid; } else { l = r = mid; } while (l > left) { l--; r++; char tchr = ochr[l]; ochr[l] = ochr[r]; ochr[r] = tchr; } return ochr; } } }
以上兩種算法,都需要將源字符串兩端的空字符去掉。