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

开源君
• 阅读 14871

前几天在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)
        }
      }
    }        

结语

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

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
9个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
4年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
胡哥有话说 胡哥有话说
4年前
面试官在“逗”你系列:数组去重你会几种呀?
前言数组去重是一个老生常谈的话题,也是前端童鞋在面试时的一道高频题。本文将深入的探索数组去重的原理及实现,为各位小伙伴提供多种可以反手“调戏”面试官的解决方案。话不多说,上去就来一梭子...数组去重核心原理价值100W的核心原理上来就给你了...,记得留言点赞鸭!1.一般我们都会创建临时变量tmp,存储不重复的元素(以数组元素存储或对
待兔 待兔
3年前
12个有用的JavaScript数组技巧
数组是Javascript最常见的概念之一,它为我们提供了处理数据的许多可能性,熟悉数组的一些常用操作是很有必要的。1、数组去重1、from()叠加newSet()方法字符串或数值型数组的去重可以直接使用from方法。varplants'Saturn','Earth','Uranus','Mercury','Venus','Earth',
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
4年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Stella981 Stella981
4年前
Golang数组去重
方法一://这种发放适用于string,int,float等切片,会对切片中的元素进行排序funcSliceRemoveDuplicates(slicestring)string{sort.Strings(slice)i:0varjint
贾蔷 贾蔷
5个月前
力扣1137题 解题思路和步骤 C++代码实现,力扣一共多少题
一、题目分析力扣1137题要求我们找到第N个泰波那契数。泰波那契数的定义是:T00,T11,T21,且在n0的条件下Tn3TnTn1Tn2。,当n4时,T4T3T2T14。这道题主要考查我们对递归或动态规划的理解和运用。在思考解题方法时,我们