注意边界,注意边界,注意边界,重要的的问题说三遍
题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
代码如下:
1 public class ReverseSentences { 2 3 /* 4 *思路: 5 *和LDR左移字符串那题思路一样,只不过这次是根据空格对多个字符串进行求逆,最后再整体求逆 6 * 设逆运算函数为r(x); 7 * ZYX = r(r(Z))r(r(Y))r(r(x)) 8 * 9 * 需要注意的是边界问题,最后一个单词的翻转要考虑 10 */ 11 public void ReverseStr(char [] str,int start,int end) 12 { 13 char tmp; 14 while(start < end) 15 { 16 tmp = str[start]; 17 str[start] = str[end]; 18 str[end] = tmp; 19 start++; 20 end--; 21 } 22 } 23 24 public String ReverseSentence(String str) { 25 26 if(str == null || str.length() == 0) 27 { 28 return str; 29 } 30 char strArray[] = str.toCharArray(); 31 32 int start = 0,end = 0; 33 for(int i = 0; i < strArray.length; i++) 34 { 35 if(strArray[i] == ' ') 36 { 37 ReverseStr(strArray, start, end); 38 start = end = i + 1;//跳过空格继续翻转下一个单词 39 } 40 else 41 { 42 end = i; 43 } 44 } 45 46 ReverseStr(strArray,start,strArray.length - 1); //翻转最后一个单词,由于上面的循环是翻转空格之前的单词,会漏掉最后一个 47 48 ReverseStr(strArray, 0, strArray.length - 1); //对整个句子进行翻转 49 50 return new String(strArray); 51 } 52 53 public static void main(String[] args) { 54 // TODO Auto-generated method stub 55 56 String string = "I am a student."; 57 58 ReverseSentences reverseSentences = new ReverseSentences(); 59 60 String str = reverseSentences.ReverseSentence(string); 61 62 System.out.println(str); 63 64 } 65 66 }