問題:如何把字符串 “We are the world” 轉成 “world the are we” ?如果最多只能用兩個額外的變量又該如何實現這樣的轉換?
分析:1.把字符串轉成字符數組,然后對字符數組進行操作。
2.選擇倒置字符數組的方法:用一個臨時變量來交換兩個字符;如果元素整數可以利用 A=A+B, B=A-B, A=A-B 方式來交換元素。
3.根據數組中首尾字符的位置來倒置它們之間的字符。
4.優化方法:減少循環的次數,減少變量的個數。
C#代碼:
using System.Linq; namespace MyTest { /// <summary> /// 用最少的變量和最高的效率實現: /// 把"we are the world"倒置成"world the are we" /// </summary> public class Program { static void Main(string[] args) { //待處理的字符串 string myStr = "we are the world"; System.Console.WriteLine("原始字符串:{0}", myStr); System.Console.WriteLine("改進方法的處理結果:{0}", ReverseArray(myStr.ToArray())); System.Console.ReadKey(); } /// <summary> /// 倒置字符數組,改進后的方法 /// 改進地方: /// 1.只利用兩個額外的變量:start 和 end /// 2.最多兩層循環 /// </summary> /// <param name="array">被倒置的字符數組</param> /// <returns>倒置后的字符數組</returns> static string ReverseArray(char[] array) { //第一步:把整個字符數組倒置 ReverseArrayEmlement(array, 0, array.Length - 1); //第二步:依次倒置字符數組中的某個單詞(不包括最后一個單詞) //記錄某個單詞的起始位置 int wordStartPosition = 0; for (int wordEndPosition = 0; wordEndPosition < array.Length; wordEndPosition++) { if (array[wordEndPosition] == ' ') { ReverseArrayEmlement(array, wordStartPosition, wordEndPosition - 1); wordStartPosition = wordEndPosition + 1; } } //第三步:倒置字符數組中的最后一個單詞 for (int wordEndPosition = array.Length - 1; wordEndPosition > 0; wordEndPosition--) { if (array[wordEndPosition] == ' ') { ReverseArrayEmlement(array, wordEndPosition + 1, array.Length - 1); break; } } //返回字符串 return new string(array); } /// <summary> /// 倒置字符數組中,起始位置和結束位置之間的字符 /// </summary> /// <param name="localArray">字符數組</param> /// <param name="startPosition">起始位置</param> /// <param name="endPosition">結束位置</param> static void ReverseArrayEmlement(char[] localArray, int startPosition, int endPosition) { // 注意:(startPosition + endPosition) / 2 + 1 這里必須+1,不然最中間位置的兩個元素就沒有交換了 // 1.利用輔助變量,依次交換數組中的頭尾元素(優點:數組元素類型可以為任意類型,缺點:需要額外存儲空間) char temp = ' '; for (int i = startPosition; i < (startPosition + endPosition) / 2 + 1; i++) { temp = localArray[i]; localArray[i] = localArray[startPosition + endPosition - i]; localArray[startPosition + endPosition - i] = temp; } // 2.結合整數運算規則,依次交換數組中的頭尾元素(優點:不需要任何額外空間,缺點:數組元素類型只能是整數類型) for (int i = startPosition; i < (startPosition + endPosition) / 2 + 1; i++) { //交換兩個整型變量的思路: a = a + b, b = a - b, a = a - b //注意:當 a=b 時,該方法就會出錯,把 a 變成 0 了 if (i != startPosition + endPosition - i) { localArray[i] = (char)(localArray[i] + localArray[startPosition + endPosition - i]); localArray[startPosition + endPosition - i] = (char)(localArray[i] - localArray[startPosition + endPosition - i]); localArray[i] = (char)(localArray[i] - localArray[startPosition + endPosition - i]); } } // 3.模擬移位操作,每次交換數組元素后都移動整個數組(優點:可以通過移位來實現字符串的倒置,缺點:需要額外空間、移位操作在數組中好像無法實現) char temp1 = ' '; for (int i = startPosition; i < endPosition + 1; i++) { temp1 = localArray[endPosition]; for (int j = 0; j < endPosition - i; j++) { localArray[endPosition - j] = localArray[endPosition - j - 1]; } localArray[i] = temp1; } } } }