剑指 Offer 58 - I. 翻转单词顺序

92 阅读2分钟

题目

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

解析

数组解法

这题较为简单,通过将字符串转换为数组,把数组反转后,再拼接成字符串即可。

具体步骤如下:

  1. 先对字符串s执行trim方法,去除左右空格
  2. 对字字符串s.split(" ")执行按空格分割为数组
  3. 使用filter过滤数组中为空的元素
  4. 最后通过数组的join(" ")方法转换为字符串

字符串遍历解法

从后往前遍历字符串s 的每一个字符,如果是" "就跳过,反之则保留。

具体步骤如下:

  1. 声明res字符串保存反转后的结果
  2. 声明i = s.length-1 指向字符串末尾字符,从后往前扫描每一个字符,
  3. 如果当前字符是' ', i-- 继续向前扫描
  4. 声明word保存遍历中的单词, 当前字符不为' ', 拼接到word上, i--继续向前扫描
  5. 当字符为' '时, word + ' ' 拼接到 res上,继续下一轮循环
  6. i < 0 时, 说明遍历结束,终止循环,返回结果res.trim(), 因为最后一个单词多拼了一个空格

参考代码

使用数组API

/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    return s.trim().split(" ").filter(v => !!v).reverse().join(" ");
};

字符串遍历

/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    // 声明res 字符串保存反转后的结果
    let res = "";
    let i = s.length - 1;
    // 从后往前遍历
    while(i >= 0) {
        // 如果当前字符是' ', i-- 指针一直向前走
        while(s[i] && s[i] === ' ') {
            i--;
        }
        // 用word 保存单词
        let word = '';
        // 当前字符存在,且不为 ' ', 拼接到word上, 指针继续向前走
        while(s[i] && s[i] !== ' ') {
            word = s[i] + word;
            i--;
        }
        // 当前单词添加空格
        word += ' ';
        // 添加当前单词到结果
        res += word; 
    }
    
    // 由于最后一个单词多拼了一个 ' ', 所以trim 去除 
    return res.trim();
};

原题链接

剑指 Offer 58 - I. 翻转单词顺序