面试题——4种数组去重的方法

数组去重或者其衍生作为笔试题或者机试题出现的几率也是很大的,写出的方法越多,则让面试官觉得你思维越开阔,那么成功的几率当然就大了。

废话不多说,下面来说说下面我整理的4中数组去重的方法

方法一: findInArr方法+select方法组合

  findInArr : 查找一个数在当前数组中是否存在,存在返回true,找完所有没有找到,返回false,这个数就是我们要操作的那个数组

  select      :循环数组,并调用findInArr方法 查找当前arr[i]在arr2中是否存在,如果返回false 那么就把当前这个数 arr[i] ,push到新的数组 arr2中,最后return arr2

 1 function findInArr(n ,arr){
 2     for (var i = 0; i < arr.length; i++) {
 3         if (n == arr[i]) {
 4             return true;
 5         }
 6     }
 7     return false;
 8 }
 9 function select (arr){
10     var arr2 = [];
11     for(var i = 0; i < arr.length; i++){
12         if (!findInArr(arr[i],arr2)) {
13             arr2.push(arr[i]);
14         }
15     }
16     return arr2;
17 }
View Code

方法二 :利用json特性 

  创建一个空的json,通过对key的检索,---> !json[arr[i]],取反说明不存在

  这样我们可以对其进行赋值,json[arr[i]] = true;  对于 赋什么值,随意,保证它的键值对就行

  并且把当前这个数push 或者其他方式都行 ,总是添加到新数组 arr2中,最后return arr2

 1 function select (arr){
 2     var json = {};
 3     var arr2 = [];
 4     for (var i = 0; i < arr.length; i++) {
 5         if (!json[arr[i]]) {
 6             json[arr[i]] = true;
 7             arr2.push(arr[i])
 8         }
 9     }
10     return arr2;
11 }
View Code

方法三: 相邻数比较法,这个方法前提是先用sort 进行简单排序,不需要改进版的

  经过sort排序之后,我们不论它排序是否正确,但是有一点我们能确定,那就是相同的一定被排到了一起

  那么我们对排序之后的数组遍历,并且让当前的数和下一个数进行比较,如果相等那么用splice(i,1) 方法对其进行删除,这时候i的值需要 i--,避免它少比一次,最后return arr;

 1 function select(arr){
 2     arr.sort();
 3     for (var i = 0; i < arr.length; i++) {
 4         if (arr[i] == arr[i+1]) {
 5             arr.splice(i,1)
 6             i--;
 7         }
 8     }
 9     return arr;
10 }
View Code

方法四:使用数组的indexOf方法 (IE8--不兼容)

  通过判断arr2.indexOf(arr[i]) == -1 ,来确定新数组arr2中没有arr[i],并将其添加到数组arr2中,最终返回 arr2

1 function select (arr){
2     var arr2 = [];
3     for( var i = 0; i < arr.length; i++){
4         if (arr2.indexOf(arr[i]) == -1) {
5             arr2.push(arr[i])
6         }
7     }
8     return arr2;
9 }
View Code

  上述四中方法肯定存在的性能的差异,可以从速度上,所占内存等进行比较,我没有测过所以就不妄加定论。希望测过的朋友,能告知 。谢谢

转载于:https://www.cnblogs.com/NTWang/p/6246621.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值