https://leetcode-cn.com/problems/reverse-words-in-a-string/
好吧今天又傻一天,可变字符串的交换给我整傻了,再没有像原来的String那么好操作了,写出了个稀巴烂的代码,回头复习一下别人的优质解法。
主要研究一下StringBuilder
这个类的用法,在里面怎么反转字符串
我的解法:
class Solution {
public String reverseWords(String s) {
//初级解法
//先分割
//由后往前拼接
String[] str = s.split(" ");
int len = str.length;
StringBuilder sb = new StringBuilder();
for(int i = len - 1; i >= 0; i--){
if(str[i] == "")continue;
sb.append(str[i]+" ");
System.out.println(str[i]);//原来分割之后空格也会在数组里面单独出现
}
len = sb.length();//除去空格
return sb.substring(0, len-1);
}
}
优质解法:
class Solution {
public String reverseWords(String s) {
StringBuilder sb = removeSpace(s); // 1. 去除字符串前后以及中间多余的空格
reverseString(sb, 0, sb.length() - 1); // 2. 翻转整个字符串
reverseEachWord(sb); // 3. 翻转每个单词
return sb.toString();
}
public void reverseString(StringBuilder sb, int start, int end) {
while (start < end) {
char temp = sb.charAt(start);
sb.setCharAt(start, sb.charAt(end));
sb.setCharAt(end, temp); // 双指针交换StringBuilder前后的字符
start++;
end--;
}
}
public StringBuilder removeSpace(String s) {
StringBuilder sb = new StringBuilder();
int start = 0;
int end = s.length() - 1;
while (s.charAt(start) == ' ') start++; // 删除字符串开头的空格
while (s.charAt(end) == ' ') end--; // 删除字符串末尾的空格
while (start <= end) {
char c = s.charAt(start);
if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') { // 当前字符为字母或者单词后的第一个空格(不是多余空格)
sb.append(c); // 此步骤去除字符串中间多余的空格, 将当前字符添加到StringBuilder
}
start++;
}
return sb;
}
public void reverseEachWord(StringBuilder sb) {
int start = 0;
int end = 1;
int len = sb.length();
while (start < len) {
while (end < len && sb.charAt(end) != ' ') { // end指针记录每个单词后空格的位置
end++;
}
reverseString(sb, start, end - 1); // 翻转end指针前的单词
start = end + 1; // 更新start指针, 指向下一个单词的第一个字符
end = start + 1; // 更新end指针(即使下一个单词只有一个字母, end指针也是指向单词后的空格)
}
}
}
作者:ilovediana
链接:https://leetcode-cn.com/problems/reverse-words-in-a-string/solution/java-zi-fu-chuan-de-duo-chong-cao-zuo-xi-epov/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。