剑指offer05(Java)-替换空格(简单)

发布时间 2023-04-09 11:40:42作者: 我不想一直当菜鸟

题目:

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

 

示例 1:

输入:s = "We are happy."
输出:"We%20are%20happy."
 

限制:

  • 0 <= s 的长度 <= 10000

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ti-huan-kong-ge-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

方法一:使用一个新的对象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 }

方法二:双指针

 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 // }
16 class Solution {
17     public String replaceSpace(String s) {
18         //特判
19         int len = s.length();
20         if (len == 0 || s == null) return s;
21         //统计空格数量,并扩充2倍
22         StringBuffer sb = new StringBuffer();
23         for (int i = 0; i < len; i++){
24             if (s.charAt(i) == ' ') sb.append("  ");
25         }
26         //如果sb没有空格
27         if (sb.length() == 0) return s;
28         //将空格加到原字符后面
29         s += sb.toString();
30         //将字符串转为字符数组
31         char[] str = s.toCharArray();
32         //i指向原字符串末尾,j指向新字符串末尾
33         int i = len - 1, j = str.length - 1;
34         while (i != j){
35             if (str[i] != ' '){
36                 str[j] = str[i];
37                 j--;
38             }else{
39                 str[j--] = '0';
40                 str[j--] = '2';
41                 str[j--] = '%';
42             }
43             i--;
44         }
45         return new String(str);
46     }
47 }

注意:两个地方

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

 这时“%20”已经添加完毕,i没变仍为空格,j位置又会开始加“%20”,i就一直不动,导致违背题意(可以自己在草稿纸上推一下),故i--需要写在后面,保证i一直在往前移动。

②为什么最后一个j也要减减?

j--:表示先使用后减。最后一个j使用后再减1,是为了跳到下一个位置,后续可以放其他字符。

小知识:

StringBuilder类 和 StringBuffer类:

  • StringBuilder: 可变的字符序列 , 线程不安全的,效率高,底层是 char[]数组 存储

  • StringBuffer : 可变的字符序列 , 线程安全的,效率低 ,底层是 char[]数组 存储