【算法题】删除数组中重复的元素

在项目开发中,我们可能会遇到需要去除数组中重复元素的情况,这时候就要通过先排序后去重的方式操作。

第一步:我们先通过JavaScript中的reduce用法查看一下每个元素的个数(此步骤不是删除重复元素所必须的):

//定义未排序、有重复元素的数组
var array = [0, 2, 1, 0, 4, 1];
//通过reduce统计数组中每个元素的个数
var arrayInfo = array.reduce((pre,cur)=>{
    if(cur in pre){
        pre[cur]++;
    }
    else{
        pre[cur] = 1;
    }
    return pre;
},{});
console.log('数组的元素个数',arrayInfo)

第二步:根据第一步结构得出array数组中存在重复的元素,接下来我们需要对array数组中的元素进行排序。(因为本案例中使用的数字数组,也可以使用sort()函数直接排序)。

//定义未排序、有重复元素的数组
var array = [0, 2, 1, 0, 4, 1];
//排序算法:这里使用冒泡排序
var Bubble = function () {
    for (let i = 0; i < array.length; i++) {
        for (let j = 0; j < array.length - 1 - i; j++) {
            if (array[j] > array[j + 1]) {
                [array[j], array[j + 1]] = [array[j + 1], array[j]]
            }
        }
    }
    return array;
}
console.log('排序后的数组',Bubble(array))

第三步:对排序后的数组进行去重(因为是基本类型的数组,也可以通过Array.from(new Set(数组))的方式直接进行去重)。我介绍两种方法:

1、在允许定义新数组的前提下

//数组去重函数
var removeDuplicates = function (array) {
    //定义空数组存放最终值
    var result = [];
    array.forEach(element => {
        //如果element的值不在result内,就push到result内
        if (!(element in result)) {
            result.push(element)
        }
    });
    return result;
}
console.log('去重后的结果', removeDuplicates(array))

2、在不允许定义新数组的前提下

//定义数组去重函数(不产生定义新的数组,LeetCode 26.)
var removeDuplicates = function (array) {
    let n = array.length;
    //如果数组为空数组,直接返回原数组
    if (n === 0) {
        return array;
    } else {
        let fast = 1, slow = 1;
        while (fast < n) {
            if (array[fast] !== array[fast - 1]) {
                array[slow] = array[fast];
                ++slow;
            }
            ++fast;
        }
        return array.splice(0, slow)
    }
}
console.log('去重后的结果',removeDuplicates(array))

 这样就完成了“删除数组中重复的元素”的功能啦。

我会将自己平时项目中常见的问题以及笔试面试的知识在CSDN与大家分享,一起进步,加油。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Dai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值