剑指offer05(Java)-替换空格(简单)
Posted 我不想一直当菜鸟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer05(Java)-替换空格(简单)相关的知识,希望对你有一定的参考价值。
题目:
请实现一个函数,把字符串 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() 方法将此序列转换为字符串。
class Solution public String replaceSpace(String s) //特判 if (s == null || s.length() == 0) return s; StringBuffer sb = new StringBuffer(); for (int i = 0; i < s.length(); i++) if (s.charAt(i) == \' \') sb.append("%20"); else sb.append(s.charAt(i)); return sb.toString();
方法二:双指针
需要将空格替换为 "%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--;
- 返回值:修改后的字符串数组转为字符串返回 ;
class Solution public String replaceSpace(String s) //特判 int len = s.length(); if (len == 0 || s == null) return s; //统计空格数量,并扩充2倍 StringBuffer sb = new StringBuffer(); for (int i = 0; i < len; i++) if (s.charAt(i) == \' \') sb.append(" "); //如果sb没有空格 if (sb.length() == 0) return s; //将空格加到原字符后面 s += sb.toString(); //将字符串转为字符数组 char[] str = s.toCharArray(); //i指向原字符串末尾,j指向新字符串末尾 int i = len - 1, j = str.length - 1; while (i != j) if (str[i] != \' \') str[j] = str[i]; j--; else str[j--] = \'0\'; str[j--] = \'2\'; str[j--] = \'%\'; i--; return new String(str);
注意:两个地方
①为什么i--要写在后面而不是写在j--后面?
这时“%20”已经添加完毕,i没变仍为空格,j位置又会开始加“%20”,i就一直不动,导致违背题意(可以自己在草稿纸上推一下),故i--需要写在后面,保证i一直在往前移动。
②为什么最后一个j也要减减?
j--:表示先使用后减。最后一个j使用后再减1,是为了跳到下一个位置,后续可以放其他字符。
小知识:
StringBuilder类 和 StringBuffer类:
-
StringBuilder: 可变的字符序列 , 线程不安全的,效率高,底层是 char[]数组 存储
-
StringBuffer : 可变的字符序列 , 线程安全的,效率低 ,底层是 char[]数组 存储
LeetCode(剑指 Offer)- 05. 替换空格
题目链接:点击打开链接
题目大意:略。
解题思路:略。
相关企业
- 小米集团
AC 代码
- Java
// 解决方案(1)
class Solution
public String replaceSpace(String s)
return s.replace(" ", "%20");
// 解决方案(2)
class Solution
public String replaceSpace(String s)
StringBuilder res = new StringBuilder();
for(Character c : s.toCharArray())
if(c == ' ') res.append("%20");
else res.append(c);
return res.toString();
- C++
class Solution
public:
string replaceSpace(string s)
int count = 0, len = s.size();
// 统计空格数量
for (char c : s)
if (c == ' ') count++;
// 修改 s 长度
s.resize(len + 2 * count);
// 倒序遍历修改
for(int i = len - 1, j = s.size() - 1; i < j; i--, j--)
if (s[i] != ' ')
s[j] = s[i];
else
s[j - 2] = '%';
s[j - 1] = '2';
s[j] = '0';
j -= 2;
return s;
;
以上是关于剑指offer05(Java)-替换空格(简单)的主要内容,如果未能解决你的问题,请参考以下文章