题目:

请实现一个函数,把字符串 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)-替换空格(简单)的更多相关文章

  1. 剑指Offer02之替换空格

    剑指Offer02之替换空格 题目描述 实现一个方法,将输入的字符串中的空格替换成%20. 例子如下 hello world --> hello%20world 代码实现 //方法一 采用Jav ...

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

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

  3. 《剑指offer》替换空格

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

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

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

  5. 【Java】 剑指offer(4) 替换空格

    本文参考自<剑指offer>一书,代码采用Java语言.  更多:<剑指Offer>Java实现合集 题目 请实现一个函数,把字符串中的每个空格替换成"%20&quo ...

  6. 剑指offer——03替换空格

    题目描述 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy.   注意事项: <剑指o ...

  7. Go语言实现:【剑指offer】替换空格

    该题目来源于牛客网<剑指offer>专题. 请实现一个函数,将一个字符串中的每个空格替换成"%20". 例如,当字符串为We Are Happy.则经过替换之后的字符串 ...

  8. 剑指Offer 05. 替换空格(java解题)

    目录 1. 题目 2. 解题思路(通用 3. 数据类型功能函数总结 4. java代码 1. 题目 请实现一个函数,把字符串 s 中的每个空格替换成%20. 示例 1: 输入:s = "We ...

  9. 剑指offer:替换空格

    题目描述: 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 思路: 一开始没理解,函数中 ...

  10. 剑指 Offer 05. 替换空格

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

随机推荐

  1. npm install --legacy-peer-deps 安装出现依赖包冲突的解决方案

    npm install --legacy-peer-deps 安装出现依赖包冲突的解决方案 为什么 在安装依赖包的时候,会有依赖包的冲突 比如A包引用了C的1.0版本 B包依赖了C的1.1版本 win ...

  2. gyroflow.xyz - 视频防抖 支持相机 gopro 不支持手机视频 - 软件推荐

    gyroflow.xyz - 视频防抖 支持相机 gopro 不支持手机视频 - 软件推荐 https://gyroflow.xyz/ https://github.com/gyroflow/gyro ...

  3. 关于初始化page入参的设计思路

    最近在重构老的代码,在写的过程中发现之前的逻辑如果遇到没有入参pageNo会Npe,于是乎我想找找公司项目有啥方式处理page入参的有两种如下 使用三元表达式直接判断是否null,然后赋值 使用map ...

  4. 记一次kafka无法生产发送消息排查经历

    参考,欢迎点击原文:https://stackoverflow.com/questions/37902167/kafka-error-while-fetching-metadata-with-corr ...

  5. Justep X5 Studio,业界公认第一的快速开发平台

    Justep X5 Studio,业界公认第一的快速开发平台,提供完全可视化.组件化开发环境,具备超强的工作流.组织机构和权限.复杂图表和报表.丰富的业务规则定制能力,以及各种浏览器环境下的复杂业务展 ...

  6. 编译OpenWRT-for-MT7620A(带8021x验证)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  7. BABYRE 【攻防世界】 Reverse

    题目 丢进Exeinfo PE里面,得到64bit,无壳 丢进IDA pro(x64)里面,找到主函数 代码中有一个花指令:*(unsigned int (__fastcall **)(char *) ...

  8. css实现按钮点击水波纹效果和两边扩散效果

    废话少说,先上代码了,复制到html中即可使用 点击查看代码 <!DOCTYPE html> <html lang="en"> <head> & ...

  9. CentOS7.5安装JDK8

    1.下载地址 https://www.oracle.com/java/technologies/javase-jdk8-downloads.html 2.创建文件夹 mkdir /usr/java 3 ...

  10. nginx location块

    location块在server块中使用,它的作用是根据客户端请求URL去定位不同的应用. 匹配格式 作用 location = /uri = 表示精确匹配,只有完全匹配上才能生效 location ...