44 翻转单词顺序列
题目要求:
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么
题目应该有一个隐含条件,就是不能用额外的空间。虽然 Java 的题目输入参数为 String 类型,需要先创建一个字符数组使得空间复杂度为 O(n),但是正确的参数类型应该和原书一样,为字符数组,并且只能使用该字符数组的空间。任何使用了额外空间的解法在面试时都会大打折扣,包括递归解法。正确的解法应该是和书上一样,先旋转每个单词,再旋转整个字符串。
两次翻转
1 public class Solution { 2 //先来写翻转函数 3 public void reverse(char[] c, int start, int end){ 4 while(start < end){ 5 char temp= c[start]; 6 c[start]=c[end]; 7 c[end] = temp; 8 start++; 9 end--; 10 } 11 } 12 public String ReverseSentence(String str) { 13 //第一次翻转 14 char[] carr= str.toCharArray(); 15 reverse(carr,0,carr.length-1); 16 //根据空格分开每个单词,对每个单词进行第二次翻转 17 int s=0;int e=0;int i=0; //设置start和end和遍历变量 18 while(i<carr.length){ 19 while(i<carr.length && carr[i] ==' ') i++; //跳过空格 20 e = i; 21 s = i; //找到了单词的起始位置 22 while(i<carr.length && carr[i] !=' '){//确定终点位置,调试bug的时候,一直没发现!=我写成了== 23 i++; 24 e++; 25 } 26 reverse(carr,s,e-1); //起始和终点都确定,则进行翻转 27 } 28 return new String(carr); 29 } 30 }
利用堆栈
将句子按照空格,分割成一个个单词,入栈. 然后再出栈,顺序正好翻转
1 import java.util.Stack; 2 public class Solution { 3 public String ReverseSentence(String str) { 4 //特殊情况:str为空或者str为空格(但是不确定有多少个空格,要用trim) 5 if (str.trim().equals("") || str==null ) return str; 6 //新建一个堆栈 7 Stack<String> reverse = new Stack<String>(); 8 String string = str.trim(); 9 //将去掉首尾多余空格的字符串string进行按空格" "的分割 10 String[] stringarray = string.split(" "); 11 for (int i = 0; i<stringarray.length; i++) { 12 reverse.push(stringarray[i]); 13 } 14 string = reverse.pop(); 15 while (!reverse.isEmpty()) { 16 string = string + " " + reverse.pop(); 17 } 18 return string; 19 } 20 }
利用split方法,和上面的堆栈方法类似
1 public class Solution { 2 public String ReverseSentence(String str) { 3 if(str.trim().equals("")){ 4 return str; 5 } 6 String[] a = str.split(" "); 7 StringBuffer o = new StringBuffer(); 8 int i; 9 for (i = a.length; i >0;i--){ 10 o.append(a[i-1]); 11 if(i > 1){ 12 o.append(" "); 13 } 14 } 15 return o.toString(); 16 } 17 }
作者:shareidea
出处:https://www.cnblogs.com/shareidea94/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号