题目:
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例1:
输入:s = " hello world "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 2:
输入:s = "a good example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
我们可以直接使用Java中的方法split(),reverse(),join() ,trim()可以解决。
Collections.reverse():对集合进行翻转
String.join():第1个参数是分隔符,第2个参数是需要进行拼接的元素,可以是多个字符串,可以是字符串数组,可以是字符串列表。
trim():返回一个新的去掉首尾空格的字符串
class Solution {
public String reverseWords(String s) {
//去掉首尾空格
s = s.trim();
//利用正则表达式以及split()方法对s进行分割
String[] str = s.split(" +");
//将str转换为list集合
List<String> list = Arrays.asList(str);
//将str翻转
Collections.reverse(list);
//使用join()将" "与str进行拼接
String res = String.join(" ",list);
return res;
}
}
不借助API,自己实现函数:
class Solution {
public String reverseWords(String s) {
StringBuffer str = trimSpacebar(s);
reverseSentence(str,0,str.length() - 1);
reverseWord(str);
return str.toString();
}
//去除空格
public StringBuffer trimSpacebar(String s){
int left = 0;
int right = s.length() - 1;
//取出首尾空格
while(s.charAt(left) == ' '){
left++;
}
while(s.charAt(right) == ' '){
right--;
}
//去除中间多余空格
StringBuffer sb = new StringBuffer();
while(left <= right){
char c = s.charAt(left);
if(c != ' '){
//如果c不是空格,直接添加
sb.append(c);
}else if(sb.charAt(sb.length() - 1) != ' '){
//如果sb最后一个不是空格,就添加(保证sb中没有连续出现的空格)
sb.append(c);
}
left++;
}
return sb;
}
//翻转句子
public void reverseSentence(StringBuffer s,int left,int right){
while(left < right){
char c = s.charAt(left);
s.setCharAt(left++,s.charAt(right));
s.setCharAt(right--,c);
}
}
//反转每个单词
public void reverseWord(StringBuffer s){
int start = 0,end = 0;
while(end + 1 < s.length()){
while(s.charAt(end + 1) != ' '){
end++;
if(end == s.length() - 1){
break;
}
}
//翻转
reverseSentence(s,start,end);
//此处一定要加2,不能加1,(要跳过中间空格进行交换)
start = end + 2;
end++;
}
}
}
自己遇到的问题:
setCharAt()是StringBuffer,StringBuilder类中的方法,不是String类中的
进行每个单词的反转时,start没有加2,导致中间空格也参了翻转
trim()是返回一个新字符串,并不是在原字符串上进行修改
在实现每个单词的反转时,主要借助了StringBuffer的setCharAt()方法和CharAt()两个方法