剑指offer_反转字符串顺序

题目描述

牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?

题目应该有一个隐含条件,就是不能用额外的空间。虽然 Java 的题目输入参数为 String 类型,需要先创建一个字符 数组使得空间复杂度为 O(N),但是正确的参数类型应该和原书一样,为字符数组,并且只能使用该字符数组的空 间。任何使用了额外空间的解法在面试时都会大打折扣,包括递归解法。 正确的解法应该是和书上一样,先旋转每个单词,再旋转整个字符串。

 1 public class Solution {
 2     public String ReverseSentence(String str) {
 3         int n = str.length();
 4         char ch[] = str.toCharArray();
 5         int i=0,j=0;
 6         while(j<=n){
 7             if(j==n||ch[j]==' '){
 8                 reserve(ch,i,j-1);
 9                 i=j+1;
10             }
11             j++;
12         }
13         reserve(ch,0,n-1);
14         return new String(ch);
15     }
16     
17     public void reserve(char ch[],int i,int j){
18         while(i<j){
19             swap(ch,i,j);
20             i++;j--;
21         }
22     }
23     
24     public void swap(char ch[],int i,int j){
25         char temp = ch[i];
26         ch[i] = ch[j];
27         ch[j] = temp;
28     }
29 }

 

posted @ 2019-09-17 09:45  chyblogs  阅读(211)  评论(0)    收藏  举报