剑指offer05(Java)-替换空格(简单)
题目:
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."
限制:
- 0 <= s 的长度 <= 10000
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
参考题解:代码随想录
方法一:使用一个新的对象StringBuffer,复制 s,复制的过程对其判断,是空格则替换,否则直接复制。
Java StringBuffer toString() 方法返回此字符序列的字符串表示形式。StringBuffer 类的一个对象表示一个字符序列。toString() 方法将此序列转换为字符串。
1 class Solution {
2 public String replaceSpace(String s) {
3 //特判
4 if (s == null || s.length() == 0) return s;
5 StringBuffer sb = new StringBuffer();
6 for (int i = 0; i < s.length(); i++){
7 if (s.charAt(i) == ' '){
8 sb.append("%20");
9 }else{
10 sb.append(s.charAt(i));
11 }
12 }
13 return sb.toString();
14 }
15 }
方法二:双指针
需要将空格替换为 "%20" ,字符串的总字符数增加,因此需要扩展原字符串 s 的长度,计算公式为:新字符串长度 = 原字符串长度 + 2 * 空格个数。图片来源:K神老师

思路:
- 初始化:字符串 s 的长度 len,进行判空 ;
- 增加长度:定义一个可变字符序列StringBuffer,如果遇到原字符串中的一个空格,就将StringBuffer添加两个空格,遍历完后,如StringBuffer中没有空格,则直接返回s,否则将空格数添加至原字符后面。
- 倒序遍历修改:将原字符串变为字符串数组,i 指向原字符串尾部元素len -1, j 指向新字符串尾部元素;当 i = j 时跳出(代表左方已没有空格,无需继续遍历);
- 当 s[i] 不为空格时:执行 s[j] = s[i] , j--;
- 当 s[i] 为空格时:挨个添加字符-- "%20" ;
- 上两步都判断后执行:i--;
- 返回值:修改后的字符串数组转为字符串返回 ;
1 class Solution {
2 public String replaceSpace(String s) {
3 //特判
4 int len = s.length();
5 if (len == 0 || s == null) return s;
6 //统计空格数量,并扩充2倍
7 StringBuffer sb = new StringBuffer();
8 for (int i = 0; i < len; i++){
9 if (s.charAt(i) == ' ') sb.append(" ");
10 }
11 //如果sb没有空格
12 if (sb.length() == 0) return s;
13 //将空格加到原字符后面
14 s += sb.toString();
15 //将字符串转为字符数组
16 char[] str = s.toCharArray();
17 //i指向原字符串末尾,j指向新字符串末尾
18 int i = len - 1, j = str.length - 1;
19 while (i != j){
20 if (str[i] != ' '){
21 str[j] = str[i];
22 j--;
23 }else{
24 str[j--] = '0';
25 str[j--] = '2';
26 str[j--] = '%';
27 }
28 i--;
29 }
30 return new String(str);
31 }
32 }
注意:两个地方

①为什么i--要写在后面而不是写在j--后面?

这时“%20”已经添加完毕,i没变仍为空格,j位置又会开始加“%20”,i就一直不动,导致违背题意(可以自己在草稿纸上推一下),故i--需要写在后面,保证i一直在往前移动。
②为什么最后一个j也要减减?
j--:表示先使用后减。最后一个j使用后再减1,是为了跳到下一个位置,后续可以放其他字符。

小知识:
StringBuilder类 和 StringBuffer类:
StringBuilder: 可变的字符序列 , 线程不安全的,效率高,底层是 char[]数组 存储
StringBuffer : 可变的字符序列 , 线程安全的,效率低 ,底层是 char[]数组 存储
剑指offer05(Java)-替换空格(简单)的更多相关文章
- 剑指Offer02之替换空格
剑指Offer02之替换空格 题目描述 实现一个方法,将输入的字符串中的空格替换成%20. 例子如下 hello world --> hello%20world 代码实现 //方法一 采用Jav ...
- 代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串
第一题344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这 ...
- 《剑指offer》替换空格
本题来自<剑指offer> 替换空格 题目: 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are% ...
- 菜鸟刷题路:剑指 Offer 05. 替换空格
剑指 Offer 05. 替换空格 class Solution { public String replaceSpace(String s) { StringBuilder str = new St ...
- 【Java】 剑指offer(4) 替换空格
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现一个函数,把字符串中的每个空格替换成"%20&quo ...
- 剑指offer——03替换空格
题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 注意事项: <剑指o ...
- Go语言实现:【剑指offer】替换空格
该题目来源于牛客网<剑指offer>专题. 请实现一个函数,将一个字符串中的每个空格替换成"%20". 例如,当字符串为We Are Happy.则经过替换之后的字符串 ...
- 剑指Offer 05. 替换空格(java解题)
目录 1. 题目 2. 解题思路(通用 3. 数据类型功能函数总结 4. java代码 1. 题目 请实现一个函数,把字符串 s 中的每个空格替换成%20. 示例 1: 输入:s = "We ...
- 剑指offer:替换空格
题目描述: 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 思路: 一开始没理解,函数中 ...
- 剑指 Offer 05. 替换空格
链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/ 标签:字符串 题目 请实现一个函数,把字符串 s 中的每个空格替换成"%2 ...
随机推荐
- day01-数据库的安装和使用
Java数据库的安装和使用 1.数据库的作用 一个问题:淘宝网.京东.微信抖音,都有各自的功能,那么我们退出系统的时候,为什么信息还在? 解决之道-文件,数据库 为了解决上诉问题,使用更加利于管理数据 ...
- java的内存模型认识
参考,欢迎点击原文:https://www.bilibili.com/video/BV1CW411U726(B站) https://www.bilibili.com/video/BV12t411u72 ...
- FFmpeg命令行之ffplay
一.简述 ffplay是以FFmpeg框架为基础,外加渲染音视频的库libSDL构建的媒体文件播放器. 二.命令格式 在安装了在命令行中输入如下格式的命令: ffplay [选项] ['输入文件'] ...
- 移植openssh-7.5p1(包括openssl-1.0.2l、zlib-1.2.11)到HISI3520d(编译篇)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- 元宇宙是VR虚拟现实的未来吗?
从科幻小说到商业现实 自从 Facebook年更名为 Meta 以来,关于元宇宙的热议不断,人们对虚拟世界的兴趣也重新燃起,因为尽管虚拟现实 (VR) 的概念由来已久,但该技术现在才开始真正得以应用. ...
- 在 Google Colab 中使用 JuiceFS
Google Colaboratory(Colab)是一个由 Google 提供的云端 Jupyter 编程笔记本,直接通过浏览器即可进行 Python 编程.Colab 充分利用谷歌的闲置云计算资源 ...
- 《.NET内存管理宝典 》(Pro .NET Memory Management) 阅读指南 - 第3章
本章勘误: 暂无,等待细心的你告诉我哦. 本章注解: 暂无 本章释疑: 暂无,等待你的提问 致谢: MVP 林德熙 MVP 吕毅 sPhinX 相关链接 试读记录
- verilog之预编译
verilog之预编译 1.基本作用 预编译,就是在verilog进入编译器前的准备工作.一般是完成一些文件的调用,一些编译器的设置,一些参数的定义.一般使用include,define,timesc ...
- 看看谷歌如何在目标检测任务使用预训练权值 | CVPR 2022
论文提出能够适配硬件加速的动态网络DS-Net,通过提出的double-headed动态门控来实现动态路由.基于论文提出的高性能网络设计和IEB.SGS训练策略,仅用1/2-1/4的计算量就能达到静态 ...
- KingbaseES V8R6 中walminer的使用
前言 walminer工具可以帮助dba挖掘wal日志中的内容,看到某时间对应数据库中的具体操作.例如挖掘日志后可以看到数据库某时间有哪些dml语句. walminer的限制与约束 WalMiner工 ...