【算法日记63】翻转单词顺序

题目描述

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,表单符号和普通字符一样处理。例如输入字符串“I am a student.”,则输出”student. a am I”。

首先要翻转句子中单词的顺序,则先将整个句子翻转。然后要求单词内字符顺序不变,则对各个单词在进行一个翻转。单词间通常以空格字符分隔。

public class Solution {
    public String ReverseSentence(String str) {
        if (str == null) return null;
        char [] strList = str.toCharArray();
        Reverse(strList, 0, strList.length-1);
        
        int begin = 0;
        for (int i = 0; i < strList.length; i++) {
            if (strList[i] == ' ') {
                Reverse(strList, begin, i-1);
                begin = i + 1;
            }
        }
        if (begin < strList.length)  // 最后一个单词不在循环内,单独翻转
            Reverse(strList, begin, strList.length-1);
        return String.valueOf(strList);
    }
    
    public void Reverse(char [] strList, int begin, int end) {
        while (begin < end) {
            char temp = strList[begin];
            strList[begin] = strList[end];
            strList[end] = temp;
            begin++;
            end--;
        }
    }
}