树哥刷题记 - 151.颠倒字符串中的单词

93 阅读2分钟

大家好,我树哥

LeetCode链接

使用Js且对数组API较为熟悉的同学在看到这道题目,肯定会觉得这还不简单?这也算得上中等难度?

  1. 使用split将其按空格分割成数组
  2. 来个fitler过滤下空字符串
  3. 然后再来个reverse反转数组
  4. 最后来个join, 齐活

直接上代码,只需要一行就可以完美解决

var reverseWords = function(s) {
  return s.split(" ").filter(item => item !== "").reverse().join(' ')
};

一段操作猛如虎,确实也通过了lc上的所有用例,数据如下(还不错)企业微信截图_682f905e-b126-4e7c-9746-76e0b692f87f.png
但是这么做,我们不就是调参🦐了嘛,作为一个有追求的程序员,难道我们应该这么做嘛?😄应该,毕竟能解决问题的程序员都是好程序员。

如果不能调用数组原生的API,我们该怎么做呢?(参考代码随想录)

  1. 去除多余空格
  2. 翻转整个字符串
  3. 翻转单个单词
var reverseWords = function(s) {
	// 反转
  function _reverse(strArr, start, end) {
    while (start < end) {
      [strArr[start], strArr[end]] = [strArr[end], strArr[start]]
      start++
      end--
    }
  }
  // 去除空格
  let result = Array.from(s)
  let slowIndex = 0;
  for (let i=0; i<result.length; i++) {
    if (result[i] != " ") {
      //遇到非空格就处理,即删除所有空格。
      if (slowIndex !== 0) result[slowIndex++] = " "; //手动控制空格,给单词之间添加空格。slow != 0说明
      while (i < result.length && result[i] != " ") {
        //补上该单词,遇到空格说明单词结束。
        result[slowIndex++] = result[i++];
      }
    }
  }
	// 去除多余长度
  result.splice(slowIndex)
  // 翻转整个字符串
  reverseWords(result, 0, result.length - 1)
  let start = 0
  let end = 0
  while (start < result.length) {
    end = start;
    while (result[end] !== " " && end < result.length) {
      end++;
    }
    // 翻转单个单词
    reverseWords(result, start, end - 1);
    start = end + 1;
  }
  return result.join('');
}

接下来就到了激动人心的提交时刻啦😄,铛铛铛铛铛铛
企业微信截图_afd8b5a1-1055-41a5-8b9a-57150c3d13a2.png
从这里可以看到调参🦐还是略胜一筹的。

在这里延伸一下数组的定义,主要就是两个点: 连续、相同类型、连续内存。 但是JS 的数组可以存放不同类型的元素、并且数组长度是可变的😄。
从源码来看,JS的数组底层就是个 Map ,key 为0,1,2,3这种索引,value 就是数组的元素。数组的index其实是字符串。

参考: juejin.cn/post/684490…