DAY 42 leetcode 151--哈希表.反转字符串中的单词
题号151
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
我的解法
暴力解法,先将String转为字符数组,遍历找出空格所在地,然后再倒着将其加入,然后在这个过程中加上各种条件限制
class Solution {
public String reverseWords(String s) {
char[]arr=s.toCharArray();
int count=0;
ArrayList<Integer> list=new ArrayList<>();
if(arr.length==1)
return s;
for(int i=0;i<arr.length-1;i++){
if(arr[0]!=' '&&count==0)
{
list.add(-1);
count++;
}
if(arr[i]==' '&&arr[i+1]!=' ') {
list.add(i);
count++;
}
}
ArrayList<String> clist=new ArrayList<>();
for(int i=count-1;i>=0;i--) {
int j = list.get(i);
while (j+1<arr.length&&arr[j+1] != ' ') {
clist.add(String.valueOf(arr[j+ 1]));
j++;
}
if(i!=0)
clist.add(" ");
}
String ans="";
for(String str:clist){
ans+=str;
}
return ans;
}
}
另解:
class Solution {
public String reverseWords(String s) {
//先删除空格
StringBuilder str=delSpace(s);
//再反转字符串
str.reverse();
//再反转子串
myreserve(str);
return str.toString();//转为string类返回
}
public StringBuilder delSpace (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中前一个字符不是空格则加入
{
sb.append(c);
}
++left;
}
return sb;
}
public StringBuilder myreserve(StringBuilder s){
int i=0;
int j=0;
while(j<s.length()){
if(s.charAt(j)!=' ')
j++;
else {
myreserve1(s, i, j - 1);
j++;
i = j;
}
}
//反转最后一个单词
myreserve1(s,i,j-1);
return s;
}
public StringBuilder myreserve1(StringBuilder s,int a,int b){
int slow=a;
int fast=b;
while(slow<fast){
//反转操作(首尾交换)
char tmp=s.charAt(slow);
s.setCharAt(slow,s.charAt(fast));
s.setCharAt(fast,tmp);
slow++;
fast--;
}
return s;
}
}
思路:先删除空格,再整个反转,最后逐一反转
再另解
class Solution {
public String reverseWords(String s) {
int left = 0, right = s.length() - 1;
// 去掉字符串开头的空白字符
while (left <= right && s.charAt(left) == ' ') {
++left;
}
// 去掉字符串末尾的空白字符
while (left <= right && s.charAt(right) == ' ') {
--right;
}
Deque<String> d = new ArrayDeque<String>();
StringBuilder word = new StringBuilder();
while (left <= right) {
char c = s.charAt(left);
if ((word.length() != 0) && (c == ' ')) {
// 将单词 push 到队列的头部
d.offerFirst(word.toString());
word.setLength(0);
} else if (c != ' ') {
word.append(c);
}
++left;
}
d.offerFirst(word.toString());
return String.join(" ", d);
}
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/reverse-words-in-a-string/solutions/194450/fan-zhuan-zi-fu-chuan-li-de-dan-ci-by-leetcode-sol/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
用一个双端队列,将字符串依次压入队列的头部即可