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 }

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2019-07-20 12:42  淡如水94  阅读(147)  评论(0)    收藏  举报