1. 题目描述

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。

为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。

2. 思路分析

进行 2 次不同层次的翻转。第一个层次的翻转,是对整体字符串进行翻转。第二个层次的翻转,是对翻转后字符串中的单词进行翻转。

3. 代码实现

注意:因为 js 按位重写字符,所以第一次整体字符串翻转后的每个字符,都放入了数组中。

/**
 * @param {String} sentence
 */
function reverseSentence(sentence) {
  // 第一次翻转:每个字符
  const chars = sentence.split("").reverse();
  let result = "",
    last = []; // 保存上一个空格到当前空格之间的所有字符

  chars.forEach(ch => {
    // 遇到空格,说明之前的字符组成了单词
    // 进行第二次翻转:单词
    if (ch === " ") {
      result += last.reverse().join("");
      last.length = 0; // 清空上一个单词
    }

    last.push(ch);
  });

  result += last.reverse().join("");
  return result;
}

/**
 * 测试代码,输出:
 * student.a am I
 */
console.log(reverseSentence("I am a student."));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29