字符串反轉C#的實現


字符串反轉是面試過程中出現頻率較高的算法題,今天一個牛同事讓我用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;
        }

    }
}
View Code

 

以上兩種算法,都需要將源字符串兩端的空字符去掉。


免責聲明!

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



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