剑指Offer Day03
重点:操作字符串
剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:s = “Weare
happy.”
输出:“We%20
are%20
happy.”
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ti-huan-kong-ge-lcof
第一反应:
return s.replaceAll(" ","%20");
考虑到.replaceAll()
不能用
用StringBuilder生成一个新的字符串
class Solution {
public String replaceSpace(String s) {
StringBuilder str = new StringBuilder();
for (char c : s.toCharArray()) {
if (c == ' ') {
str.append("%20");
}else {
str.append(c);
}
}
return str.toString();
}
}
很简单
用String类里的toCharArray()
得到字符数组,遍历数组内各个字符,碰见空格就当成%20
加上。
剑指 Offer 58 - II. 左旋转字符串
把字符串前面的若干个字符转移到字符串的尾部
示例 1:
输入: s = “ab
cdefg”, k = 2
输出: “cdefgab
”
https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof
重点:
字符数组是从0开始:
- 保留
[n , s.length() ]
- [0 , n)放到后面
(注意: 被转移的是 从0
开始,到 n-1
个字符,不包含 第n
个)
1. 用substring
截取重新拼接
class Solution {
public String reverseLeftWords(String s, int n) {
return s.substring(n) + s.substring(0, n);
}
}
2. 通过字符数组获取字符拼接:
同样,可以使用遍历字符数组的方式,但效率低下:
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder str = new StringBuilder();
for (int i = n; i < s.toCharArray().length; i++) {
str.append(s.toCharArray()[i]);
}
for (int i = 0; i < n; i++) {
str.append(s.toCharArray()[i]);
}
return str.toString();
}
}
提交结果:
3. 使用charAt获取字符
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder str = new StringBuilder();
for (int i = 0; i < s.toCharArray().length - n; i++) {
str.append(s.charAt(n + i));
}
for (int i = 0; i < n; i++) {
str.append(s.charAt(i));
}
return str.toString();
}
}
效率同样很低:
总结
Day03 两道题都是针对字符串的,实际上考察的还是对String的熟悉程度。
比如:
- 内部是一个字符数组
- toArray可以得到字符数组,charAt获取指定下标字符
- 还有对于substring的理解使用,只有
start
则会默认end
为最后一个字符,指定start
和end
包含start
不包含end
- 对于范围内的数据的在数组中的查找获取,
从多少开始,从多少结束
,要拎得清。