• 剑指offer:替换空格


    题目描述:

    请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

    思路:

    一开始没理解,函数中给的参数length指的字符串长度,原来表示的是这个字符串的最大长度。参考了网上的题解,说明一下思路。

    最原始的想法自然就是从头遍历字符串,遇到空格,就将空格后的字符向后移动,再插入“%20”,但是这样的复杂度为O(n^2),考虑到其实每次替换的过程中后面的字符重复做后移操作。所以考虑从后往前遍历,记录出现的空格总数,再求新字符串的总长度。

    使用两个指针,做替换操作,第一个指针指向原始字符串的末尾,第二个指针指向新字符串末尾,从后往前遍历原始字符串,若当前字符为空格,则用第二个指针在新字符串中从后往前的插入“%20”,否则将第一个指针所指向的元素复制到第二个指针的位置。

    注意点:

    对字符串的处理都应该考虑最后的空字符’’。

    空指针判断nullptr。

    一般像这种需要向后扩充容量重新整理内存的,最好能够考虑到从尾部开始整理的方法。

    代码:

    class Solution {
    public:
        void replaceSpace(char *str,int length) {
            if(str==nullptr || length==0)
                return;
            int len_str=0;
            int blank=0;
            int i=0;
            while(str[i]!='')
            {
                len_str++;
                if(str[i]==' ')
                    blank++;
                i++;
            }
            int new_len = len_str + 2*blank;
            if(new_len>length)
                return;
            while(len_str>=0 && new_len>len_str)
            {
                if(str[len_str]==' ')
                {
                    str[new_len--] = '0';
                    str[new_len--] = '2';
                    str[new_len--] = '%';
                }
                else
                {
                    str[new_len--] = str[len_str];
                }
                len_str--;
            }
            return;
        }
    };
  • 相关阅读:
    leetcode 567 滑动窗口
    田忌赛马
    去除CSDN无用的打印边框,显示数据
    操作系统博客清单
    OpenKiwi学习笔记
    开源minigui移植
    嵌入式GUI总结
    short int 变量的取值范围
    68 进程等待机制的实现 下
    67 进程等待机制的实现 上
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/10581929.html
Copyright © 2020-2023  润新知