Leetcode刷题笔记 - 《剑指Offer》面试题05 - 替换空格

替换空格

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

 

示例 1:

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

限制:

0 <= s 的长度 <= 10000

 

我的思路:

用find函数找到空格在字符串中的位置,再用replace函数将空格替换为“20%”。

C++代码如下:

class Solution {
public:
    string replaceSpace(string s) {
        while(s.find(" ")<s.size()){
            s.replace(s.find(" "),1,"%20");
        }
        return s;
    }
};

 

其他参考思路:

字符数组
由于每次替换从 1 个字符变成 3 个字符,使用字符数组可方便地进行替换。建立字符数组地长度为 s 的长度的 3 倍,这样可保证字符数组可以容纳所有替换后的字符。

获得 s 的长度 length
创建字符数组 array,其长度为 length * 3
初始化 size 为 0,size 表示替换后的字符串的长度
从左到右遍历字符串 s
获得 s 的当前字符 c
如果字符 c 是空格,则令 array[size] = '%',array[size + 1] = '2',array[size + 2] = '0',并将 size 的值加 3
如果字符 c 不是空格,则令 array[size] = c,并将 size 的值加 1
遍历结束之后,size 的值等于替换后的字符串的长度,从 array 的前 size 个字符创建新字符串,并返回新字符串

复杂性分析

  • 时间复杂度:O(n)。遍历字符串 s 一遍。
  • 空间复杂度:O(n)。额外创建字符数组,长度为 s 的长度的 3 倍。

 

解题思路2:在 Python 和 Java 等语言中,字符串都被设计成不可变的类型,即无法直接修改字符串的某一位字符,需要新建一个字符串实现。

Python 解法流程:

初始化一个 list ,记为 res ;
遍历列表 s 中的每个字符 c :
当 c 为空格时:向 res 后添加字符串 "%20";
当 c 不为空格时:向 res 后添加字符 c ;
将列表 res 转化为字符串并返回。

Java 解法流程:

初始化一个 StringBuilder ,记为 res ;
遍历字符串 s 中的每个字符 c :
当 c 为空格时:向 res 后添加字符串 "%20";
当 c 不为空格时:向 res 后添加字符 c ;
将 res 转化为 String 类型并返回。
复杂度分析
时间复杂度 O(N): 遍历使用 O(N) ,每轮添加(修改)字符操作使用 O(1) ;
空间复杂度 O(N) : Python 新建的 list 和 Java 新建的 StringBuilder 都使用了线性大小的额外空间。

 

posted @ 2020-03-12 18:04  李橙皮er  阅读(98)  评论(0编辑  收藏  举报