剑指Offer——替换空格

本文介绍了一种将字符串中的空格替换为%20的算法实现,采用双字符数组的方法,通过前后扫描和指针操作达到O(n)的时间复杂度。

题目描述:请实现一个函数,把字符串中的每个空格替换成"%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),思路还是比较简单的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值