今日心得:
先将简单的算法做出来,再来做难的。不然时间没了
* 151.反转字符串中的单词
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = "the sky is blue
" 输出:"blue is sky the
"
示例 2:
输入:s = " hello world " 输出:"world hello" 解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:
输入:s = "a good example" 输出:"example good a" 解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
自己没做出来,回到刚开始的今日心得
官方题解:
1.API选手:
class Solution {
public String reverseWords(String s) {
// 注意这里的trim代表去除字符串s开头与末端的空格,
// 这里的split(" +")代表的是将字符串以多个空格分隔后,
//以字符串数组的方式加入到words中。" +"是正则表达式的内容。
String[] words = s.trim().split(" +");
// 注意这里使用的stringBuilder的益处。
StringBuilder result = new StringBuilder();
for (int i = words.length - 1; i >= 0; i--) {
// 这里的追加操作
result.append(words[i]).append(" ");
}
// 这里trim去除最后一个追加的" ",而且转化为String类型
return result.toString().trim();
}
}
需要记住:
1.trim() 去除字符串开头和结尾的空格。
2.split() 将一个字符串按照指定的正则表达式模式分割成字符串数组。
3.append() 追加字符串函数。
4.String与StringBuilder的区别。
String
1. `String` 对象是不可变的,一旦创建,其内容不能被修改。每次对 `String` 进行操作(如拼接等)都会创建一个新的 `String` 对象,可能导致较多的内存开销和性能消耗,尤其是在频繁操作的情况下。
2. 常用于表示固定的、不需要频繁修改的文本。
StringBuilder
1. `StringBuilder` 是可变的,可以高效地进行字符串的拼接、修改等操作而不会产生大量新的对象。
2. 适用于需要动态构建和修改字符串的场景,在性能方面通常更优,尤其是当涉及大量字符串操作时。
2.自行编写API
双指针处理的典范
class Solution {
public String reverseWords(String s) {
StringBuilder sb = trimSpaces(s);
// 翻转字符串
reverse(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 reverse(StringBuilder sb, int left, int right) {
while (left < right) {
char tmp = sb.charAt(left);
sb.setCharAt(left++, sb.charAt(right));
sb.setCharAt(right--, tmp);
}
}
public void reverseEachWord(StringBuilder sb) {
int n = sb.length();
int start = 0, end = 0;
while (start < n) {
// 循环至单词的末尾
while (end < n && sb.charAt(end) != ' ') {
++end;
}
// 翻转单词
reverse(sb, start, end - 1);
// 更新start,去找下一个单词
start = end + 1;
++end;
}
}
}