• 替换空格


    请实现一个函数,把字符串中的每个空格替换成"%20"

    你可以假定输入字符串的长度最大是1000。
    注意输出字符串的长度可能大于1000。

    样例

    输入:"We are happy."
    
    输出:"We%20are%20happy."



    (双指针扫描) O(n)
    在部分编程语言中,我们可以动态地将原数组长度扩大,此时我们就可以使用双指针算法,来降低空间的使用:

    首先遍历一遍原数组,求出最终答案的长度length;
    将原数组resize成length大小;
    使用两个指针,指针i指向原字符串的末尾,指针j指向length的位置;
    两个指针分别从后往前遍历,如果str[i] == ' ',则指针j的位置上依次填充'0', '2', '%',这样倒着看就是"%20";如果str[i] != ' ',则指针j的位置上填充该字符即可。
    由于i之前的字符串,在变换之后,长度一定不小于原字符串,所以遍历过程中一定有i <= j,这样可以保证str[j]不会覆盖还未遍历过的str[i],从而答案是正确的。

    时间复杂度分析
    原字符串只会被遍历常数次,所以总时间复杂度是 O(n)。

     public String replaceSpaces(StringBuffer str) {
            int len = 0;
            for (int i = 0; i < str.length(); i++) {
                if (str.charAt(i) == ' ')
                    len += 3;
                else
                    len++;
            }
            int i = str.length() - 1;
            int j = len - 1;
            str.setLength(len);
            while (i >= 0) {
                if (str.charAt(i) == ' ') {
                    str.setCharAt(j--, '0');
                    str.setCharAt(j--, '2');
                    str.setCharAt(j--, '%');
    
                } else str.setCharAt(j--, str.charAt(i--));
                ;
            }
            return str.toString();
        }
    

    c++代码:

    string replaceSpaces(string &str) {
    
            int len = 0;
            for (auto c : str)
                if (c == ' ')
                    len += 3;
                else
                    len ++ ;
    
            int i = str.size() - 1, j = len - 1;
    
            str.resize(len);
    
            while (i >= 0)
            {
                if (str[i] == ' ')
                {
                    str[j -- ] = '0';
                    str[j -- ] = '2';
                    str[j -- ] = '%';
                }
                else str[j -- ] = str[i];
                i -- ;
            }
            return str;
        }
    

      

    加油啦!加油鸭,冲鸭!!!
  • 相关阅读:
    2019年9月15日晚间测试-T1
    机房巨佬的随机名称生成器
    初来乍到
    GKurumi记
    GKurumi记
    小P的团战
    什么才算是真正的编程能力?
    java冒泡排序和快速排序
    “转行做程序员”很难?这里有4个重要建议
    Linux文件I/O(一)
  • 原文地址:https://www.cnblogs.com/clarencezzh/p/10929267.html
Copyright © 2020-2023  润新知