力扣 剑指 Offer 05 替换空格
文章目录
题目链接
https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/
1、题目要求
简单来说将给定的一个字符串,将字符串里面的所有空格替换为%20;
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."
2、思路分析 - 基于双指针法的单个字符替换
-
1、首先进行字符串的扩容,扩容的字符个数由输入字符串中包含的空格所决定;使用 StringBuilder 在单线程下面提升字符串的拼接速度;
-
2、确定扩容的容量之后,与传递进来的字符串 s 进行合并;
-
3、确定两个指针的起始位置
确定第一个指针:left = s.length() - 1;
确定第二个指针:right = (扩容后的s).length() - 1; -
4、进行循环处理:
当 left 指向的 chars 数组中的元素不是空格的时候,进行元素的复制;
当 left 指向的 chars 数组中的元素是空格的时候,进行空格的替换
3、执行代码 - Java
class Solution {
public String replaceSpace(String s) {
// 判断传进来的字符串非空以及长度是不是 0
if (s == null || s.length() == 0) {
return s;
}
// 创建出来一个 str 用来得到需要扩展的数组长度
StringBuilder str = new StringBuilder(); // 用于字符串的拼接
for (int i = 0; i < s.length(); i++) {
char temp = s.charAt(i);
if (temp == ' ') {
str.append(" "); // 扩展两个空格
}
}
// 判断出原来的字符串没有空格,不需要扩展的时候直接返回 s
if (str.length() == 0) {
return s;
}
// 得到扩展好的字符串,使用双指针进行元素的代替
int left = s.length() - 1;
s += str.toString();
// 下面使用双指针对于 s 进行操作
int right = s.length() - 1;
char[] chars = s.toCharArray();
while (left >= 0) {
if (chars[left] != ' ') { // s 转换成为 字符数组才可以使用数组索引
chars[right] = chars[left];
} else {
chars[right--] = '0';
chars[right--] = '2';
chars[right] = '%';
}
left--;
right--;
}
return new String(chars);
}
}
4、问题反思
4.1、chars[right–] = ‘0’; 的理解
这个等同于 chars[right] = ‘0’; right–;
4.2、return new String(chars);
所有的替换操作是基于这个 char 数组展开的,所以在返回的时候,需要将其转换成为 String 数组进行返回即可;
5、小结
根据双指针的形式,进行了输入字符串中包含的空格代替。解决数组中的某个元素或者某几个元素代替的时候,均可以使用先扩容然后替换的解题思路;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!