今天是字符串主题,不用想又上难度了。每天下班这么晚很难完成所有题了。不过好在最近对各种用法更熟悉了,每日任务可以更聚焦于思路。
1.翻转字符串里的单词:代码随想录 (programmercarl.com)
力扣链接:. - 力扣(LeetCode)
建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。
这个题的难点不是题目本身,因为题意就可以直接split然后从后往前遍历数组得到结果了。非常简单几行代码就行了。所以难点是进阶解法:不要使用辅助空间,空间复杂度要求为O(1)。
由题可以知道:不管用不用辅助空间,都要去除多余空格。
所以第一步:去除多余空格,包括开头和结尾的,还有中间的。
第二步,反转字符串。
第三步,反转单词。
第三步难度比较大一点。但是也还好,最重要的是想想第二步和第三步的操作有什么关联。
这个题解法很有参考性,多看看。
自己写的代码,跟网站差不多,注意思路,想一下为什么这样写,用到哪些条件。理解了写这个题就懂了。重点理解reverseString(int start, int end, StringBuilder sb)和reverseLenthString(StringBuilder sb)的调用关系。最后看一下集成了三种操作的reverseWords(String s)。
其实顺序应该是reverseWords在前,下面写实现,不过我个人喜欢从下往上写,还是看习惯吧。
package LuStudy;
public class _9_1ReverserWordsInString {
private static StringBuilder removeBlank(String s) {// 去除多余空格
StringBuilder sb = new StringBuilder();
int left = 0;
int right = s.length() - 1;
while (s.charAt(left) == ' ') {
left++;
}
while (s.charAt(right) == ' ') {
right--;
}
while (left <= right) {
if (s.charAt(left) != ' ' || sb.charAt(sb.length() - 1) != ' ') {
sb.append(s.charAt(left)); // 不要把下标输进去了,要记录的下边上的字符
}
left++;
}
return sb;
}
// 反转字符串
private static void reverseString(int start, int end, StringBuilder sb) {
while (start < end) {
char temp = sb.charAt(start);
sb.setCharAt(start++, sb.charAt(end));
sb.setCharAt(end--, temp);
}
}
// 反转指定长度的字符串
private static void reverseLenthString(StringBuilder sb) {
int start = 0;
int end = 1;
int totalLength = sb.length();
while (end < totalLength) {
// end是用来寻找每个单词的结尾位置
while (end < totalLength && sb.charAt(end) != ' ') {
end++;
}
reverseString(start, end - 1, sb); // 因为end此时在空格的位置
start = end + 1; // 上一个单词反转后到下一个字符的起始位置
end = start + 1; // end用来遍历,要比start起始位置多一个单位
}
}
public static String reverseWords(String s) {
StringBuilder sb = removeBlank(s);
reverseString(0, sb.length() - 1, sb);
reverseLenthString(sb);
return sb.toString(); // 题目要的是String,把StringBuilder要变为String
}
public static void main(String[] args) {
String s = " hello world is big! ";
System.out.println(reverseWords(s));
}
}
今天先写一个题,实在没时间了,临近周末,周六和周天学习下其他题的思路。