题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
思路 split()成列表再reverse
思路一:split()后逐个添加,注意空格
# -*- coding:utf-8 -*-
class Solution:
def ReverseSentence(self, s):
# write code here
str=s.split(' ')
str.reverse()
res=[]
for i in str:
res.append(i)
return ' '.join(res)
public class Solution {
public String ReverseSentence(String str) {
if (str.length()==0) return "";
if (str.trim().equals("")) return str;
String[] strArr=str.split(" ");
String res="";
for(int i=strArr.length-1;i>=0;i--){//此处为array型求length
res+=strArr[i];
if (i>0) res+=" ";//空格
}
return res;
}
}
思路二:倒序想到栈,注意空格处理
import java.util.*;
public class Solution {
public String ReverseSentence(String str) {
if(str.trim().equals("")) return str;
if(str.length()<=0) return "";
Stack<String> stack=new Stack<>();
String[] strArr=str.split(" ");
for(int i=0;i<strArr.length;i++){
stack.push(strArr[i]);
}
String res=stack.pop();//保证字符串之间有空格
while(!stack.isEmpty()){
res=res+" "+stack.pop();//
}
return res;
}
}
思路三:算法先反转整个句子再反转每个单词
时间复杂度O(N),空间复杂度0(1)
import java.util.*;
public class Solution {
public String ReverseSentence(String str) {
if(str.trim().equals("")) return str;
if(str.length()<=0) return "";
char[] charArr=str.toCharArray();
Reverse(charArr,0,charArr.length-1);
int preblank=-1;//单词前的空格
for(int i=0;i<charArr.length;i++){
if(charArr[i]==' '){
int postblank=i;//单词后的空格
Reverse(charArr,preblank+1,postblank-1);
preblank=postblank;
}
}
Reverse(charArr,preblank+1,charArr.length-1);//最后一个单词单独反转
return new String(charArr);
}
public void Reverse(char[] chars,int low,int high){
while(low<high){
char temp=chars[low];
chars[low]=chars[high];
chars[high]=temp;
low++;
high--;
}
}
}