剑指offer解题报告(Java版)——翻转单词顺序 左旋字符串 42

   

引言

   

这种翻转的问题会遇到很多,其实就是一个倒序的问题,对于第一个题只是想翻转单词的顺序,而并不想把整个字符串翻转了,如果完全翻转的话,比如I am a student.中所有字符翻转得到.tneduts a ma I。显然不符合要求,但已经很接近答案了,仔细观察可以发现,我们离最终答案只差一步,就是把每个空格切分出的字符串再一次反序即可,所以我们需要根据空格切分出每个单词,然后再把每个单词翻转了,然后再重新组合成句子

   

ps.书中只要求最后答案是student. a am I就可以了,但是我觉得这个.很碍事,其实对原来的句子可以不考虑最后的.进行翻转,也就是把array.length-1变成array.length-2

   

对于第二个题也是对reverse函数的变形调用,很多其实都是想通的,左旋字符串abcdefgindex=2,有时候问题不要跳太大,慢慢一步一步转的话我们就可以发现解题的关键所在,如果我们需要旋转的话应该如何去转

   

因为最后会想要成cdefgab,也就是把ab移到了后面,而之前的reverse也可以把前面的移到后面,我们不让先将整个reverse一下,gfedcba,这个与我们想要的有什么不同,如果我们cb之间有个空格的话gfedc ba是不是再翻转一下每个单词的顺序就ok了,我们这里分别对gfedcba再次调用一下reverse函数就ok,这里我们可能会用到substring这个函数

   

分析问题

   

翻转单词

   

我们先把整个句子翻转,然后以空格为split,分割字符串,接下来对每个单词再进行翻转,然后重新组合

   

翻转字符串的函数

   

static String reverse(String string) {

char[] array = string.toCharArray();

int i = 0, j = array.length - 1;

while (i < j) {

char tem = array[i];

array[i] = array[j];

array[j] = tem;

i++;

j--;

}

return String.valueOf(array);

}

   

翻转整个句子的函数

   

static String reverseSentence(String string){

String reversedString=reverse(string);

String[] splitStrings=reversedString.split(" ");

String resultString="";

for(String str:splitStrings){

resultString=resultString+reverse(str)+" ";

}

return resultString;

}

   

左旋字符串

   

我们首先也把整个字符串翻转,然后切分字符串,利用substring函数,将gfedcba分别赋值给part1part2,然后分别对part1part2翻转,然后将翻转后的字符串再连起来就可以了

posted @ 2015-05-03 10:30  keedor  阅读(1265)  评论(0编辑  收藏  举报