大家好🙌我是你们的好朋友,大数据老虾😀。相遇是缘,既然来了就拎着小板凳坐下来一起唠会儿😎,如果在文中有所收获,请别忘了一键三连,动动你发财的小手👍,你的鼓励,是我创作的动力😁!废话不多说,直接😎 开干吧!
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 都使用了线性大小的额外空间。
图解
代码
// 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 * 空格个数
算法流程
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
;
图解
复杂度分析
- 时间复杂度 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语言书籍