掌握字符串的一些API函数。
第1题: 344. 反转字符串
题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
翻译:这个不是要输出,而是让你修改原数组,对原数组进行翻转。
思路:
直接双指针法。
题解:
class Solution {
public void reverseString(char[] s) {
//这里不是要打印,是要你去修改原数组
//双指针法
if(s == null || s.length < 2) return;
int left = 0, right = s.length - 1;
while(left < right){
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}
第2题: 541. 反转字符串 II
题目描述:
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于 k 个,则将剩余字符全部反转。
- 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
翻译:就是取2k个字符,反转前k个,和上一题相比多了一些逻辑处理。
思路:
这题的关键是 end 下标的更新规则。
题解:
class Solution {
public String reverseStr(String s, int k) {
//暴力反转,理清逻辑。 取2k个字符,然后反转前k个,搞成字符数组比较好操作
char[] sChar = s.toCharArray();
//遍历 --> 间隔是2k
for(int i = 0; i < s.length(); i += 2 * k){
//起始位置
int start = i;
//结束位置,要看长度够不够,有没有超
//如果长度够是: start + k - 1, 长度不够只能去 字符串的最后
int end = Math.min(start + k - 1, s.length() - 1);
//进行反转
while(start < end){
char temp = sChar[start];
sChar[start] = sChar[end];
sChar[end] = temp;
start++;
end--;
}
}
return new String(sChar);
}
}
第3题: 剑指 Offer 05. 替换空格
题目描述:
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
翻译:没什么好说的。但是,需要注意字符串和字符比较之间的区别。
字符比较用==
。
字符串比较使用equals()
方法。
思路:
没什么好说的。
题解:
builder 实现。
正好可以比较一下直接使用String和StringBuilder的耗时。
String消耗的时间远远超过了StringBuilder。
第4题: 151. 翻转字符串里的单词
题目描述:
给你一个字符串 s ,逐个翻转字符串中的所有 单词 。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
说明:
- 输入字符串 s 可以在前面、后面或者单词间包含多余的空格。
- 翻转后单词间应当仅用一个空格分隔。
- 翻转后的字符串中不应包含额外的空格。
思路:
关键在于理清楚处理的逻辑。
(1)要处理好空格的问题。首尾不能有空格,并且中间的空格只能是一个。
(2)使用分割得到字符串数组,然后从后向前遍历这个数组即可。
题解:
class Solution {
public String reverseWords(String s) {
//移除首尾及中间的空格
String newS = removeBlack(s);
//切割
String[] strArr = newS.split(" ");
return reverse(strArr);
}
//反转字符串,并加入空格
public String reverse(String[] strArr){
StringBuilder builder = new StringBuilder();
//从后向前进行遍历
for(int i = strArr.length - 1; i >= 0; --i){
builder.append(strArr[i]);
if(i != 0){
builder.append(" ");
}
}
return builder.toString();
}
public String removeBlack(String s){
StringBuilder builder = new StringBuilder();
int left = 0, right = s.length() - 1;
//去除首
while(left < right && s.charAt(left) == ' '){
left++;
}
//去除尾
while(left < right && s.charAt(right) == ' '){
right--;
}
for(int i = left; i <= right; ++i){
if(s.charAt(i) != ' '){
builder.append(s.charAt(i));
}else{
//是空格,只要builder的最后一个字符不是空格,就加入
if(builder.charAt(builder.length() - 1) != ' '){
builder.append(s.charAt(i));
}
}
}
return builder.toString();
}
}