劍指Offer的學習筆記(C#篇)-- 替換空格

題目描述

請實現一個函數,將一個字符串中的每一個空格替換成「%20」。例如,當字符串爲We Are Happy.則通過替換以後的字符串爲We%20Are%20Happy。

一 . 本身的想法

        老實說,貌似直接能夠實現。。代碼以下:html

class Solution
{
    public string replaceSpace(string str)
    {
        return str.Replace(" ","%20");
    }
}

二 . 其餘

        使用兩個指針,方法借鑑於Edison Chouapp

        先遍歷一次字符串,這樣就能統計出字符串中空格的總數,並能夠由此計算出替換以後的字符串的總長度。函數

  之前面的字符串"We arehappy."爲例,"We are happy."這個字符串的長度是14(包括結尾符號'\0'),裏面有兩個空格,所以替換以後字符串的長度是18。從字符串的後面開始複製和替換。準備兩個指針,P1和P2。P1指向原始字符串的末尾,而P2指向替換以後的字符串的末尾。接下來向前移動指針P1,逐個把它指向的字符複製到P2指向的位置,直到碰到第一個空格爲止。接着向前複製,直到碰到第2、三或第n個空格。時間複雜度爲O(n),實現方法以下圖:spa

        代碼實現:3d

public static void ReplaceBlank(char[] target, int maxLength)
    {
        if (target == null || maxLength <= 0)
        {
            return;
        }

        // originalLength 爲字符串target的實際長度
        int originalLength = 0;
        int blankCount = 0;
        int i = 0;

        while (target[i] != '\0')
        {
            originalLength++;
            // 計算空格數量
            if (target[i] == ' ')
            {
                blankCount++;
            }
            i++;
        }

        // newLength 爲把空格替換成'%20'以後的長度
        int newLength = originalLength + 2 * blankCount;
        if (newLength > maxLength)
        {
            return;
        }

        // 設置兩個指針,一個指向原始字符串的末尾,另外一個指向替換以後的字符串的末尾
        int indexOfOriginal = originalLength;
        int indexOfNew = newLength;

        while (indexOfOriginal >= 0 && indexOfNew >= 0)
        {
            if (target[indexOfOriginal] == ' ')
            {
                target[indexOfNew--] = '0';
                target[indexOfNew--] = '2';
                target[indexOfNew--] = '%';
            }
            else
            {
                target[indexOfNew--] = target[indexOfOriginal];
            }

            indexOfOriginal--;
        }
    }
相關文章
相關標籤/搜索