剑指offer解题报告(Java版)——翻转单词顺序 左旋字符串 42
引言
这种翻转的问题会遇到很多,其实就是一个倒序的问题,对于第一个题只是想翻转单词的顺序,而并不想把整个字符串翻转了,如果完全翻转的话,比如I am a student.中所有字符翻转得到.tneduts a ma I。显然不符合要求,但已经很接近答案了,仔细观察可以发现,我们离最终答案只差一步,就是把每个空格切分出的字符串再一次反序即可,所以我们需要根据空格切分出每个单词,然后再把每个单词翻转了,然后再重新组合成句子
ps.书中只要求最后答案是student. a am I就可以了,但是我觉得这个.很碍事,其实对原来的句子可以不考虑最后的.进行翻转,也就是把array.length-1变成array.length-2
对于第二个题也是对reverse函数的变形调用,很多其实都是想通的,左旋字符串abcdefg,index=2,有时候问题不要跳太大,慢慢一步一步转的话我们就可以发现解题的关键所在,如果我们需要旋转的话应该如何去转
因为最后会想要成cdefgab,也就是把ab移到了后面,而之前的reverse也可以把前面的移到后面,我们不让先将整个reverse一下,gfedcba,这个与我们想要的有什么不同,如果我们c和b之间有个空格的话gfedc ba是不是再翻转一下每个单词的顺序就ok了,我们这里分别对gfedc和ba再次调用一下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函数,将gfedc和ba分别赋值给part1和part2,然后分别对part1和part2翻转,然后将翻转后的字符串再连起来就可以了