剑指Offer-替换字符串空格

大家好🙌我是你们的好朋友,大数据老虾😀。相遇是缘,既然来了就拎着小板凳坐下来一起唠会儿😎,如果在文中有所收获,请别忘了一键三连,动动你发财的小手👍,你的鼓励,是我创作的动力😁!废话不多说,直接😎 开干吧!

PS:文末干货,记得拎着小板凳离开的时候也给它顺走 🤣
座右铭:“懒”对一个人的毁灭性有多大,早起的重要性就多大

剑指Offer

题目

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

示例:

Input:s = "We are happy."
Output:“We%20are%20happy.

方法一:变量添加

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

算法流程

1、初始化一个list(python)/StringBuilder(Java),命名为res;

2、遍历列表s中的每个字符c:

  • 当c为空格是:向res后添加“%20”;
  • 当c不为空格时:向res后添加字符c;

3、将列表res转换为字符串并返回

复杂度分析

  • 时间复杂度 O(N): 遍历使用 O(N),每轮添加(修改)字符操作使用 O(1);
  • 空间复杂度 O(N): Python 新建的 list 和 Java 新建的 StringBuilder 都使用了线性大小的额外空间。

图解

image.png

image.png

image.png

image.png

image.png

代码

// java code
class Solution{
    public String replaceSpace(String s){
        StringBuilder res = new StringBuilder();
        for (Character c : s.toCharArray()){
            if (c == ' ')
                res.append("%20");
            else
                res.append(c)
        }
        return res.toString();
    }
}
# python code
class Solution:
    def replaceSpace(Self, s : str) -> str:
        res = []
        for c in s:
            if c == ' ':
                res.append("20%")
            else:
                res.append(c)
        return "".join(res)

方法二:原地修改

在c++语言中,string被设计成不可变的类型,因此科研在不新建字符串的情况下实现原地修改。由于需要将空格替换为“%20”,字符串的总字符数量是增加,因此需要扩展原字符串s的长度,计算公式为:示例如下图所示

新字符串长度 = 原字符串长度 + 2 * 空格个数

image.png

算法流程

1、初始化:空格数量count,字符串s的程度len;

2、统计空格数量:遍历s,遇到空格就count++;

3、修改s的长度: 添加完 “%20” 后的字符串长度应为 len + 2 * count

4、倒序遍历修改:i指向原字符串尾部元素,j指向新字符串尾部元素

  • i = j 时跳出(代表左方已没有空格,无需继续遍历);
  • s[i] 不为空格时:执行 s[j] = s[i]
  • s[i] 为空格时:将字符串闭区间 [j-2, j] 的元素修改为 “%20” ;由于修改了 3 个元素,因此需要 j -= 2

5、 返回值:已修改的字符串 s

图解

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

复杂度分析

  • 时间复杂度 O(N): 遍历统计、遍历修改皆使用 O(N)时间。
  • 空间复杂度 O(1): 由于是原地扩展 s 长度,因此使用 O(1)额外空间。

代码

class Solution {
public:
    string replaceSpace(string s) {
        int count = 0, len = s.size();
        // 统计空格数量
        for (char c : s) {
            if (c == ' ') 
                count++;
        }
        // 修改 s 长度
        s.resize(len + 2 * count);
        // 倒序遍历修改
        for(int i = len - 1, j = s.size() - 1; i < j; i--, j--) {
            if (s[i] != ' ')
                s[j] = s[i];
            else {
                s[j - 2] = '%';
                s[j - 1] = '2';
                s[j] = '0';
                j -= 2;
            }
        }
        return s;
    }
};

文末彩蛋🤩

🚗🤩😉💖🌹👀✨给各位朋友安利一下平时收集的各种学习资料!!!有需要的朋友点击一下传送门,自行领取。程序员经典名言:“收藏了就等于学会啦”。 做人也要像蜡烛一样,在有限的一生中有一分热发一份光,给人以光明,给人以温暖!
图灵程序丛书300+
Linux实战100讲
Linux书籍
计算机基础硬核总结
计算机基础相关书籍
操作系统硬核总结
Java自学宝典
Java学习资料
Java硬核资料
Java面试必备
Java面试深度剖析
阿里巴巴Java开发手册
MySQL入门资料
MySQL进阶资料
深入浅出的SQL
Go语言书籍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值