剑指Offer——替换空格

题目描述:请实现一个函数,把字符串中的每个空格替换成"%20"。

分析:首先,要将字符串转换成字符数组,再进行替换。不过在c#中,数组一旦初始化了,就无法再改变存储空间的大小,所以我用了两个字符数组。然后怎么替换呢?可以扫描到空格后将后面的字符后移,然后进行替换,这样时间复杂度为O(n^2)。有没有时间复杂度为O(n)的方法呢?我们可以试一下从后往前扫描会怎么样。先扫描一遍,获取空格的数量,然后分配空间,在原来加上两倍的空格的数量的空间,这就是空格替换后的空间。然后从后往前扫描,使用两个指针indexNew、indexCurrent,indexNew指向新字符数组的末尾,indexCurrent指向原来字符数组的末尾,若遇到空格则替换,不是则把字符移到indexNew的位置。

代码如下:

private static string ReplaceSpace(string str)
        {
            if (str == null || str=="")
                return "-1";
            string result = null;
            char[] charStr = str.ToArray();           //输入的字符串转换成的数组
            int originalLen = charStr.Length;
            int newLen = originalLen;
            //获取空格的数量
            for (int i=0;i<originalLen;i++)
            {
                if (charStr[i] == ' ')
                    newLen += 2;
            }
            char[] newChar = new char[newLen];      //新字符串数组
            for(int i=originalLen-1;i>=0;)
            {
                if(charStr[i]!=' ')
                {
                    newChar[newLen - 1] = charStr[i];
                    newLen--;
                }
                //替换空格
                else
                {
                    newChar[newLen - 1] = '0';
                    newChar[newLen - 2] = '2';
                    newChar[newLen - 3] = '%';
                    newLen -= 3;
                }
                i--;
            }
            result = new string(newChar);
            return result;
        }
总结:因为新声明了两个字符串数组,空间复杂度为O(n),思路还是比较简单的。

猜你喜欢

转载自blog.csdn.net/a_clear_chen/article/details/80241791
今日推荐