【剑指Offer】05. 替换空格 解题报告 (Python & C++ & Java)


题目地址:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/

题目描述

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

示例 1:

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

限制:

  • 0 <= s 的长度 <= 10000

解题方法

由于题目是让我们实现替换的函数,所以不能直接使用 repalceAll() 方法。

这个题目的解题思路有两种:

  1. 新建可变长度的容器:Java 的 StringBuilder/StringBuffer,C++ 的 string/vector,Python 的 string 等。
  2. 原地修改:比如 C++ 的 string 是支持扩容的。

新建可变长度的容器更为简单:遍历 str,当遇到空格的时候,直接给结果里面 append"%20";否则 append 当前的字符。

而原地修改的难度要大一点。

方法一:新建可变长度的容器

可变长度的比如 Java 的 StringBuilder/StringBuffer,C++ 的 string/vector,Python 的 string 等。

Java 代码如下:

public class Solution {
    public String replaceSpace(StringBuffer str) {
        StringBuffer ans = new StringBuffer();
        for(int i = 0; i < str.length(); i++){
            if(str.charAt(i) == ' '){
                ans.append("%20");
            }else{
                ans.append(str.charAt(i));
            }
        }
        return ans.toString();
    }
}

C++ 代码如下:

class Solution {
public:
    string replaceSpace(string s) {
        string res;
        for (char c : s) {
            if (c != ' ') {
                res += c;
            } else {
                res += "%20";
            }
        }
        return res;
    }
};

Python 代码如下:

class Solution(o bject):
    def replaceSpace(self, s):
        res = ""
        for c in s:
            if c == ' ':
                res += "%20"
            else:
                res += c
        return res

方法二:原地修改

原地修改需要对原始的 s 进行扩容,扩容的大小当然是原始的 s.size() + spaceCount * 2

遍历原始的 s 的时候,需要注意,由于是原地修改,所以如果我们从前向后遍历的话,会导致后面的字符被覆盖掉。因此只能对 s 从后向前遍历。

C++ 代码如下。

class Solution {
public:
    string replaceSpace(string s) {
        if (s.empty()) return s;
        int len = s.size();
        int spaceCount = 0;
        for (char c : s) {
            if (c == ' ')
                spaceCount ++;
        }
        s.resize(s.size() + spaceCount * 2);
        for (int i = len - 1, j = s.size() - 1; i >= 0; --i, --j) {
            if (s[i] == ' ') {
                s[j - 2] = '%';
                s[j - 1] = '2';
                s[j] = '0';
                j -= 2;
            } else {
                s[j] = s[i];
            }
        }
        return s;
    }
};

日期

2017 年 4 月 20 日
2021 年 7 月 21 日 —— 郑州暴雨,希望平安!

posted @ 2017-04-20 18:07  负雪明烛  阅读(28)  评论(0编辑  收藏  举报