LeetCode 算法入门 — 反转字符串中的单词

144 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

反转字符串中的单词 III

原题地址

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 

示例 1:

输入:s = "Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"

示例 2:

输入: s = "God Ding"
输出:"doG gniD"

提示:

  • 11 <= s.length <= 51045 * 10^4
  • s 包含可打印的 ASCII 字符。
  • s 不包含任何开头或结尾空格。
  • s 里 至少 有一个词。
  • s 中的所有单词都用一个空格隔开。

思路分析

方法一

  1. 我们都是站在巨人的肩膀上看世界,因此每个算法想到的第一解法都是使用字符串以及数组现有的 API;
  2. 现将字符串 s 按照 ' ' 拆分成 words 数组;
  3. 遍历数组,将数组每项按照 '' 拆分成数组后进行 reverse,然后 join(''),即可合并成每个单词都倒序的数组;
  4. join(' ') 后即为需要返回的字符串。

方法二

  1. 遍历数组,找到为 ' ' 的位置;
  2. ' ' 之前的元素都倒序放在结果数组 res 中,若当前位置为 ' ',则将 ' ' 也放入数组中;
  3. join('') 后即为需要返回的字符串。

AC 代码

方法一

/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    const words = s.split(' ')
    return words.map(item => item.split('').reverse().join('')).join(' ')
};

结果:

  • 执行结果: 通过
  • 执行用时:88 ms, 在所有 JavaScript 提交中击败了26.89%的用户
  • 内存消耗:47.1 MB, 在所有 JavaScript 提交中击败了48.91%的用户
  • 通过测试用例:29 / 29

方法二

/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    const res = [];
    const len = s.length;
    let i = 0;
    while (i < len) {
        let start = i;
        while (i < len && s.charAt(i) != ' ') {
            i++;
        }
        for (let j = start; j < i; j++) {
            res.push(s.charAt(start + i - 1 - j));
        }
        while (i < len && s.charAt(i) == ' ') {
            i++;
            res.push(' ');
        }
    }
    return res.join('');
};

结果:

  • 执行结果: 通过
  • 执行用时:68 ms, 在所有 JavaScript 提交中击败了90.75%的用户
  • 内存消耗:49.2 MB, 在所有 JavaScript 提交中击败了10.50%的用户
  • 通过测试用例:29 / 29

END