344.反转字符串 541.反转字符串II 151.翻转字符串里的单词
344.反转字符串
这道题太简单了,略。
541.反转字符串II
注意end指针的位置。
代码如下:
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for (int i = 0; i < s.length(); i += 2 * k) {
int left = i;
int right = Math.min(ch.length - 1, i + k - 1);
while (left < right){
char temp = ch[left];
ch[left] = ch[right];
ch[right] = temp;
left++;
right--;
}
}
return new String(ch);
}
}
151.翻转字符串里的单词
这道题比较有难度。首先要去除首尾和单词之间的空格。然后反转整个字符,接着反转每个单词。
代码如下:
class Solution {
public String reverseWords(String s) {
StringBuilder sb = trimSpaces(s);
//反转每个单词
reverseWord(sb, 0, sb.length() - 1);
// 翻转每个单词
reverseEachWord(sb);
return sb.toString();
}
public StringBuilder trimSpaces(String s){
int left = 0, right = s.length() - 1;
//去除开头结尾空白
while (left <= right && s.charAt(left) == ' ') left++;
while (left <= right && s.charAt(right) == ' ') right--;
//去除中间多余的空格
StringBuilder sb = new StringBuilder();
while (left <= right) {
char c = s.charAt(left);
if (c != ' ') {
sb.append(c);
} else if (sb.charAt(sb.length() - 1) != ' ') {
sb.append(c);
}
++left;
}
return sb;
}
public void reverseWord(StringBuilder sb, int left, int right){
char ch;
while (left < right){
ch = sb.charAt(left);
sb.setCharAt(left++, sb.charAt(right));
sb.setCharAt(right--, ch);
}
}
public void reverseEachWord(StringBuilder sb) {
int n = sb.length();
int start = 0, end = 0;
while (start < n){
while (end < n && sb.charAt(end) != ' ') end++;
//翻转单词
reverseWord(sb, start, end-1);
//更新start
start = ++end;
}
}
总结
今天只做了leetcode三道题,151.翻转字符串里的单词有点复杂。