跳至主要內容

翻转单词顺序

soulballad算法剑指Offer剑指Offer约 313 字大约 1 分钟

题目:

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

分析:

  1. 第一步翻转句子中所有的字符。比如翻转"I am a student."中所有的字符得到".tneduts a ma I",此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了。
  2. 第二步再翻转每个单词中字符的顺序,就得到了"student.a am I"。这正是符合题目要求的输出。

代码:

public class ReverseSolution {
    public static void reverse(char[] arr, int start, int end) {
        if (null == arr || start < 0 || end > arr.length - 1) {
            return;
        }

        while (start < end) {
            char temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;

            start++;
            end--;
        }
    }

    public static String reverseStr(String str) {
        if (null == str || "".equals(str)) {
            return null;
        }

        char[] chs = str.toCharArray();
        int start = 0;
        int end = chs.length - 1;

        reverse(chs, start, end);

        start = end = 0;
        while (start < chs.length) {
            if (chs[start] == ' ') {
                start++;
                end++;
            } else if (end == chs.length || chs[end] == ' ') {
                reverse(chs, start, --end);
                start = end + 1;
                end++;
            } else {
                end++;
            }
        }

        return String.valueOf(chs);
    }

    public static void main(String[] args) {
        String str = "I am a student.";
        System.out.println(reverseStr(str));
    }
}
上次编辑于:
贡献者: soulballad