42_1ReverseSentence(翻转单词顺序列)

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

/**
 * @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 ReverseSentence42_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.";
        ReverseSentence42_1 reverseSentence42_1 = new ReverseSentence42_1();
        String s = reverseSentence42_1.ReverseSentence(string);
        System.out.println(s);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值