面试题58:翻转单词顺序

 1、题目描述:

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

2、思路:

  先将整个单词进行翻转,然后在利用空格切分单词,分别将单个单词旋转回来。这里面通过定义 start 、end 两个指针来标识需要旋转的起始位置,只需要在实现一个旋转字符数组的某一个部分的方法。对字符串进行操作,都要转换成对字符数组进行操作。

3、代码:

public class Solution {
    public static void main(String[] args) {
        String s = "I am a student.";
        String s1 = ReverseSentence(s);
        System.out.println(s1);
    }

    public static String ReverseSentence(String str) {
        //先整体翻转单词
        //再将每个单词翻转回来,因此需要一个翻转部分字符的方法
        char[] c = str.toCharArray();
        //翻转整个字符串
        reverse(c, 0, c.length - 1);
        int start = 0;
        int end;
        //拆分单词
        for (int i = 0; i < c.length; i++) {
            if (c[i] == ' ' || i == c.length - 1) {
                //单词末尾end指针不需要向前移动
                if (c[i] == ' ') {
                    end = i - 1;
                } else {
                    end = i;
                }
                reverse(c, start, end);
                start = i + 1;
            }
        }
        String s = String.valueOf(c);
        return s;
    }

    public static void reverse(char[] c, int start, int end) {

        while (start < end) {
            char temp = c[start];
            c[start] = c[end];
            c[end] = temp;
            start++;
            end--;
        }

    }

}

猜你喜欢

转载自www.cnblogs.com/guoyu1/p/12212431.html
今日推荐