StringReverseSentence反转句子

匿名 (未验证) 提交于 2019-12-02 23:34:01
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/happy_bigqiang/article/details/90312171
/**  * @author LemonLin  * @Description :ReverseSentence42_1  *翻转单词顺序列  *  * 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。  * 同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。  * 例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,  * 正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?  *  * 思路:先翻转全部的字符串,再翻转每个空格分割的单词字符串。  * 本题调试bug的时候遇到很多例子无法通过:总结如下:  * 1、翻转过程出错:就是对应不上,代码出错部分,就是设置一个j的变量,j变化01234...start+j与end-j互相交换  *2、如果只有空格字符,需要返回空格,用str.trim().equals("")  * 3、如果是字符串是偶数个数(字符数组首字符下标是0),那么翻转的middle值为 (start+end)/2+1;  *      为什么加一,如果字符数组下标是012345,则必须为middle为3,小于号(0+5)/2=2,加一,则为3  * 4、需要用下标来进行翻转,所以把输入的字符串转换为字符数组,用到 str.toCharArray();  *      转换完之后再把字符数组转换为字符串String.valueOf(chars);  *  * 5、需要考虑输入的字符串没有空格分割的时候,那么翻转之后还要再翻转回来,用一个标志位进行标记  * 6、如有空格的话,最后一个单词由于没有空格来做分割线,所以需要特殊翻转最后一个  * 7、数组作为输入,一般情况下需要至少两个参数,一个是数组,一个是数组长度  * @date 2018/6/12-15:29  */ public class StringReverseSentence42_1 {     /**      *     翻转思路是用一个中间的变量来存,头尾互相交换,翻转的终止条件是到字符串的中间       */     public String ReverseSentence(String str) {         if(str == null||str.trim().equals("")){             return str;         }         char [] chars = str.toCharArray();         //翻转整个句子         Reverse(chars,0,chars.length-1);         //翻转句子中的每个单词         int j=0;         int start = j;         boolean flag = false;         while (j<chars.length){             if (chars[j]==' '){                 flag = true;                 int end = j-1;                 j++;                 Reverse(chars,start,end);                 start = j;             }             j++;         }         /*5、需要考虑输入的字符串没有空格分割的时候,那么翻转之后还要再翻转回来,用一个标志位进行标记*/         if (flag ==false){             Reverse(chars,0,chars.length-1);         }         /* * 6、如有空格的话,最后一个单词由于没有空格来做分割线,所以需要特殊翻转最后一个*/         if (flag == true){             Reverse(chars,start,chars.length-1);         }         String strChange=String.valueOf(chars);         return strChange;     }     //start 的参数为数组开头,end的参数为数组的结尾;     //数组作为输入,一般情况下需要至少两个参数,一个是数组,一个是数组长度     /**      * 3、如果是字符串是偶数个数(字符数组首字符下标是0),那么翻转的middle值为 (start+end)/2+1;      *      为什么加一,如果字符数组下标是012345,则必须为middle为3,因为for循环中i<middle注意体会这个小于号,      *      而不是小于等于号,小于号(0+5)/2=2,加一,则为3*/     public void Reverse(char[] chars,int start,int end){         char  temp= ' ';         int isZero = (start+end)%2;         int middle = 0;         if (isZero == 0){             middle = (start+end)/2;         }else {             middle = (start+end)/2+1;         }         int j=0;         for (int i =start;i<middle;i++){             temp = chars[start+j];             chars [start+j] = chars[end-j];             chars[end-j] = temp;             j++;         }     }     public static void main(String[] args) {         String string = "i am a student.";         StringReverseSentence42_1 stringReverseSentence42_1 = new StringReverseSentence42_1();         String s = stringReverseSentence42_1.ReverseSentence(string);         System.out.println(s);     }  } 
文章来源: https://blog.csdn.net/happy_bigqiang/article/details/90312171
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!