數組倒置算法擴展


問題:如何把字符串 “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;
            }
        }
    }
}

 


免責聲明!

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



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