题目:
请实现一个函数,把字符串 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[]数组 存储