「剑指Offer 05.替换空格 - 58.左旋转字符串」
题目描述
1.替换空格(level 简单)
请实现一个函数,把字符串 s
中的每个空格替换成"%20"。
示例
输入:s = "We are happy."
输出:"We%20are%20happy."
2.左旋转字符串(level 简单)
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例1
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例2
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"
思路分析(替换空格)
1.替换空格
初看这题,差点给自己整懵了。题目并没有说明禁止使用Java
中自带的replace
函数,毕竟一行代码就能解决的事情。不过实际面试中遇到这题的概率应该是极低的。即使遇到了,考察的应该也不是直接使用replace
函数,话说回来,想不到其他方法总比不写好。需要明确的是:在Java中字符串是不可变类型,无法原地操作,可以构建StringBuilder
以新字符串操作并返回结果。
2.代码实现(机灵鬼法)
class Solution {
public String replaceSpace(String s) {
if (s == null) {
return null;
}
return s.replace(" ", "%20");
}
}
3.代码实现(StringBuilder替换)
class Solution {
public String replaceSpace(String s) {
if (null == s) {
return null;
}
StringBuilder result = new StringBuilder();
for (char c : s.toCharArray()) {
if (' ' == c) {
result.append("%20");
} else {
result.append(c);
}
}
return result.toString();
}
}
这里循环遍历字符串时考虑使用字符
char
而不是Character
避免装箱时间。
时间复杂度O(N):遍历整个字符串,线性关系。
空间复杂度O(N):Java中字符串被设计成不可变的类型,新建的StringBuilder占用线性空间,与长度相关。
思路分析(左旋转字符串)
与上题一样,直接切割+拼接
立马可以得出结果,但是转念一想,事情好像并不是那么简单。
1.分析
也没有明确表示不可以使用切割
方法,保险起见还是写了两种解法,还是使用StringBuilder
进行字符串的拼接。
2.代码实现(sub切割)
class Solution {
public String reverseLeftWords(String s, int n) {
if (null == s) {
return null;
}
if (n + 1 > s.length()) {
return s;
}
return s.substring(n) + s.substring(0, n);
}
}
3.代码实现(遍历字符串+StringBuilder拼接)
题解之前,有必要先熟悉一下Java
中求余%
操作。
class Solution {
public String reverseLeftWords(String s, int n) {
if (null == s) {
return null;
}
StringBuilder res = new StringBuilder();
for (int i = n; i < n + s.length(); i++) {
res.append(s.charAt(i % s.length()));
}
return res.toString();
}
}
求余操作在这里仅仅为了使代码简化
复杂度
时间复杂度O(N): 需要遍历整个字符串,线性关系。
空间复杂度O(N):辅助StringBuilder
,空间复杂度与字符串长度成线性关系