• 作者: 负雪明烛
  • id: fuxuemingzhu
  • 个人博客:http://fuxuemingzhu.cn/
  • 个人微信公众号:负雪明烛

题目地址: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 日 —— 郑州暴雨,希望平安!

【剑指Offer】05. 替换空格 解题报告 (Python & C++ & Java)的更多相关文章

  1. 菜鸟刷题路:剑指 Offer 05. 替换空格

    剑指 Offer 05. 替换空格 class Solution { public String replaceSpace(String s) { StringBuilder str = new St ...

  2. 代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串

    第一题344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这 ...

  3. 剑指 Offer 05. 替换空格

    链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/ 标签:字符串 题目 请实现一个函数,把字符串 s 中的每个空格替换成"%2 ...

  4. 【剑指Offer】反转链表 解题报告(Python)

    [剑指Offer]反转链表 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描 ...

  5. 【剑指Offer】矩阵覆盖 解题报告(Python)

    [剑指Offer]矩阵覆盖 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描 ...

  6. 【剑指Offer】扑克牌顺子 解题报告(Python)

    [剑指Offer]扑克牌顺子 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描 ...

  7. 【剑指Offer】丑数 解题报告

    [剑指Offer]丑数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述: ...

  8. 【剑指Offer】序列化二叉树 解题报告(Python)

    [剑指Offer]序列化二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...

  9. 《剑指offer》替换空格

    本题来自<剑指offer> 替换空格 题目: 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are% ...

随机推荐

  1. R语言与医学统计图形【1】par函数

    张铁军,陈兴栋等 著 R语言基础绘图系统 基础绘图包之高级绘图函数--par函数 基础绘图包并非指单独某个包,而是由几个R包联合起来的一个联盟,比如graphics.grDevices等. 掌握par ...

  2. Dango之form校验组件

    目录 1.引入案例 2. form组件的功能 3. form组件的使用 3.1 自定义form校验类 3.2 校验数据 3.3 渲染页面 3.4 展示错误信息 3.5 自定义校验结果 3.6 form ...

  3. MySQL 的查询优化

    说起 MySQL 的查询优化,相信大家收藏了一堆奇技淫巧:不能使用 SELECT *.不使用 NULL 字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解它背 ...

  4. mysql 索引的注意事项

    mysql 无法使用索引的查询 索引是什么,为什么要用索引,索引使用的时候要注意什么,那些情况下索引无法起作用. 1,索引是什么 mysql的索引也是一张表,并且是一个有序的表,主要记录了需要索引的数 ...

  5. makefile高级用法

    在某些文件里面找.o find ./ -name "*.o" -e ls- R 看文件目录下面的文件 嵌套 和 VPATH [1]VPATH的用法 (1)VPATH:虚路径 1) ...

  6. 给lua_close实现回调函数

    先讲下为什么会需要lua_close回调吧. 我用C++给lua写过不少库,其中有一些,是C++依赖堆内存,并且是每一个lua对象使用一块单独的内存来使用的. 在之前,我一直都是魔改lua源代码,给l ...

  7. A Child's History of England.14

    At first, Elfrida possessed great influence over the young King, but, as he grew older and came of a ...

  8. InnoDB学习(二)之ChangeBuffer

    ChangeBuffer是InnoDB缓存区的一种特殊的数据结构,当用户执行SQL对非唯一索引进行更改时,如果索引对应的数据页不在缓存中时,InnoDB不会直接加载磁盘数据到缓存数据页中,而是缓存对这 ...

  9. 零基础学习java------day10------带包编译,权限修饰符,内部类,调式,junitTest

    0.  带包编译 解决使用notepad++编写的java类中如果有package的解决方案,如下代码 package com._51doit.test; class HelloWorld{ publ ...

  10. pyqt5 的串口编写进度

    2020.12.18 今天遇到一个问题, 想用回车实现串口数据的发送. 下面这句话是让光标移动到文字的尾部,但是不能够实现. 对QTextEdit控件中的文字改写,或清除后,再调用下面的移动到尾部,就 ...