资讯专栏INFORMATION COLUMN

js数组去重(包含ES6解决方案)

Near_Li / 1932人阅读

摘要:前几天在做了一道题,这道题的核心问题是数组去重。现写一函数,返回一个新的升序的字符串,其值由中的值组成,要求包含最多字符且不能重复。代码中的和函数是中的数组方法。

前几天在codewars做了一道题,这道题的核心问题是数组去重。昨晚之后看到别人的solution,感觉自己的solution太low了。

题目

Take 2 strings s1 and s2 including only letters from ato z. Return a new sorted string, the longest possible, containing distinct letters, - each taken only once - coming from s1 or s2.

有两个字符串s1和s2,值只能为a-z。现写一函数,返回一个新的升序的字符串,其值由s1、s2中的值组成,要求包含最多字符且不能重复。

例如:

a = "xyaabbbccccdefww"
b = "xxxxyyyyabklmopq"
longest(a, b) -> "abcdefklmopqwxy"

a = "abcdefghijklmnopqrstuvwxyz"
longest(a, a) -> "abcdefghijklmnopqrstuvwxyz"
My Solution

先贴自己的代码。
我的方案是通过一个新数组存储字符串,函数getDistinct负责将s1、s2中的字符保存到target数组中且确保不会出现重复字符。
代码中的Array.fromincludes函数是ES6中的数组方法。

    function longest(s1, s2) {
      let distStr,
          value,
          distArr = []
      getDistinct(distArr, s1 + s2)
      // 数组排序并转成字符串
      distStr = distArr.sort().join("")
      return distStr
    }
    // 数组去重
    function getDistinct(target, source) {
      let value
      // 将字符串转成数组
      source = Array.from(source)
      for(value of source) {
        // 如果target数组中没有该value,则将其添加到数组中
        if(!target.includes(value)) {
          target.push(value)
        }
      }
    }
    
Best Solution

这是所有答案中最精妙的一个,仅用了一行就搞定了。(瞬间发现差距悬殊啊)
这个方案首先利用ES6中提供的Set数据结构对字符串(s1+s2)“去重”,然后结构赋值得到数组,最后进行排序并转成字符串。

const longest = (s1, s2) => [...new Set(s1+s2)].sort().join("")
Other Solution

下面这个方案是我自己方案的ES5版本(不兼容IE8以下的浏览器)

    function longest(s1, s2) {
      var distStr,
          value,
          distArr = []
      getDistinct(distArr, s1 + s2)
      // 数组排序并转成字符串
      distStr = distArr.sort().join("")
      return distStr
    }
    // 数组去重
    function getDistinct(target, source) {
      var index,
          value
      // 将字符串转成数组
      source = Array.prototype.slice.call(source, 0)
      for(index in source) {
        value = source[index]
        // 如果target数组中没有该value,则将其添加到数组中
        if(target.indexOf(value) === -1) {
          target.push(value)
        }
      }
    }
    

下面这个方案通过新建一个hash对象来记录已存储的字符。

    function longest(s1, s2) {
      var distStr,
          value,
          distArr = []
      getDistinct(distArr, s1 + s2)
      // 数组排序并转成字符串
      distStr = distArr.sort().join("")
      return distStr
    }
    // 数组去重
    function getDistinct(target, source) {
      var hash = {},
          index,
          value
      // 将字符串转成数组
      source = Array.prototype.slice.call(source, 0)
      for(index in source) {
        value = source[index]
        // 如果hash对象中没有该key,则将其添加到数组中
        if(!hash[value]) {
          target.push(value)
          // 给hash添加一个value属性,值为true
          hash[value] = true
        }
      }
    }
    

还有一种方案是先排序,再比较相邻的两个字符,只有当前字符不等于下一个字符的时候,才存储当前字符。

    function longest(s1, s2) {
      var distStr,
          value,
          distArr = []
      getDistinct(distArr, s1 + s2)
      // 数组排序并转成字符串
      distStr = distArr.join("")
      return distStr
    }
    // 数组去重
    function getDistinct(target, source) {
      var index,
          value
      // 将字符串转成数组
      source = Array.prototype.slice.call(source, 0)
      source = source.sort()
      for(index in source) {
        value = source[index]
        // 如果target数组中没有该value,则将其添加到数组中
        if(value !== source[index + 1]) {
          target.push(value)
        }
      }
    }        
结语

由于这是我人生第一篇博文,用词和语法有不妥的地方,请多多包含。同时,如果文中有错误的地方,请狠狠地吐槽。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80569.html

相关文章

  • JS数组去重方法小结

    摘要:数组去重看了网上很多数组去重方法,用的比较常见的大概就几种,今天想自己来做一个总结。还有就是方法返回的数组也是排序后的数组,某些情况下可能不符合要求。 JS数组去重 看了网上很多数组去重方法,用的比较常见的大概就几种,今天想自己来做一个总结。部分内容参考该博客 1 . 在原数组上操作(基本方法) 思路:利用循环嵌套,判断数组中每个元素与其后面的元素是否相等,如果相等,就使用spli...

    PascalXie 评论0 收藏0
  • js基本操作-数组去重

    摘要:基本操作数组去重数组去重的方法临时数组保存其实这里面还没考虑到数组里面嵌套数组对象的情况把去重后的结果放在一个临时数组中对原来数组的元素与临时数组元素比较临时数组中不存在这个元素的放入临时数组。 js基本操作-数组去重 数组去重的方法 1. 临时数组保存(其实这里面还没考虑到数组里面嵌套数组/对象的情况) 把去重后的结果放在一个临时数组中, 对原来数组的元素与临时数组元素比较, 临时...

    GeekGhc 评论0 收藏0
  • js数组去重方法总结

    摘要:注方法可以返回某个指定字符串在字符串中首次出现的位置比如首次出现的位置是数组中的第一个,即下标为遍历数组使用标识符去重声明一个变量标识排序后遍历过滤数组思路先给数组排序,这样相同的项总是相邻。 假设我们有数组arr,并且声明新数组hash用来存放去重后的元素: var arr = [23,44,5,2,23,5,1,7,8,7]; //包含重复元素 var hash= [];...

    snowLu 评论0 收藏0
  • js数组去重方法分析与总结

    摘要:阶段该阶段主要通过循环遍历数组从而达到去重的目的多次循环去掉重复元素以下所有方法默认都那拿该数组进行测试结果如下图可见除了没有去掉,其他效果都还挺好。 数组去重经常被人拿来说事,虽然在工作中不常用,但他能够很好的考察js基础知识掌握的深度和广度,下面从js的不同阶段总结一下去重的方法。 ES3阶段 该阶段主要通过循环遍历数组从而达到去重的目的 多次循环去掉重复元素 // 以下所有方法默...

    nevermind 评论0 收藏0

发表评论

0条评论

Near_Li

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<