JZ44 翻转单词序列
题目链接: JZ44 翻转单词序列
题目描述:
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“nowcoder. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a nowcoder.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
示例:
输入:
"nowcoder. a am I"
返回值:
"I am a nowcoder."
题解:
方法一: 利用栈
1.思路
把每一个单词当作一个整体存入栈中,之后再按序出栈。记得加空格
2.复杂度:
时间复杂度: O(2n)
空间复杂度: O(2n)
3.代码:
import java.util.*;
public class Solution {
public String ReverseSentence(String str) {
// 方法一: 利用栈
String res = "";
if(str.length()==0)
return res;
Stack<String> stack = new Stack<>();
String s = "";
for(int i=0; i<str.length(); i++){
if(str.charAt(i)==' '){
stack.push(s);
s = "";
}else{
s += str.charAt(i);
}
}
stack.push(s);
while(!stack.isEmpty()){
s = stack.pop();
res += s;
if(!stack.isEmpty())
res += " ";
}
return res;
}
}
方法二: 自定义翻转函数
1.思路:
利用示例来来演示:
输入的string为: “nowcoder. a am I”
将整体翻转之后为:“I ma a .redocwon”
再将每一个单词翻转之后为:“I am a nowcoder.”
所以就是将整体翻转之后再处理每一个单词。
2.复杂度:
时间复杂度:O(2n)
空间复杂度:O(2n)
3.代码:
import java.util.*;
public class Solution {
public String ReverseSentence(String str) {
// 方法二:自定义反转函数
String res="";
if(str.length()==0)
return res;
int start=0;
int end =0;
int len = str.length();
char [] s = str.toCharArray();
reverse(s, 0, len-1);
for(int i=0; i<len; i++){
if(s[i]==' '){
reverse(s, start, end-1);
start=i+1;
}
end++;
}
reverse(s, start, end-1);
return String.valueOf(s);
}
void reverse(char[] s, int start, int end){
while(start<end){
char temp = s[start];
s[start] = s[end];
s[end] = temp;
end--;
start++;
}
}
}