翻转单词顺序
翻转单词顺序列
http://www.nowcoder.com/questionTerminal/3194a4f4cf814f63919d0790578d51f3
我一开始的想法是利用栈的先进后出的思想反转字符串即可,但是要注意特殊的输入用例,比如全部字符串字符为空,此时应返回原字符串即可,还有需要注意最后一个输出的子字符串(student)没有空格,因此最后一个子字符串可以不入队,当然也可以使用subString方法不返回最后一个空格。
记录split()方法:以某个符号分割字符串成为字符串数组
import java.util.Stack; public class Solution { public String ReverseSentence(String str) { if(str==null||str.length()<=0){ return str; } String[] s=str.split(" ");//使用split来对字符串进行分割,这里使用空格进行分割 if(s.length==0)//如果该字符串中除空格外不存在字符,则分割后字符串数组为空,直接返回原字符串即可 return str; Stack<String> res=new Stack<>(); String ans=""; for(int i=0;i<s.length;i++){ res.push(s[i]); } while(!res.isEmpty()){ ans+=res.pop(); ans+=" "; } return ans.substring(0,ans.length()-1); } }
但这种方法利用了辅助空间,增加了空间复杂度。下面记录滑动窗口法:
1.将整个字符串反转
2.再逐个反转
最后需要把字符数组转化为字符串:String.valueOf(s);
import java.util.Stack; public class Solution { public String ReverseSentence(String str) { if(str==null||str.length()<=0){ return str; } char[] s=str.toCharArray(); Reverse(0,str.length()-1,s);//整体反转 int l=0; int r=0; while(l<str.length()){ if(s[r]==' '){ Reverse(l,r-1,s); r++; l=r; } if(r==s.length-1){ Reverse(l,r,s); break; } r++; } return String.valueOf(s); } private void Reverse(int l,int r,char[] s){ while(l<r) { char tmp=s[l]; s[l]=s[r]; s[r]=tmp; l++; r--; } } }