zoukankan      html  css  js  c++  java
  • 数组去重

    昨天去面试,做了个面试题,数组去重,回来查了一下,总结有这几种:

    方法1:

    1. 使用新的数组存放去重后的结果

    2. 循环遍历未去重的数组,将该数组的的每一个元素与去重数组的的每个元素相比较,如果不相等就把该元素添加到已经去重的数组中

      // 方法1
            var a = [1,1,2,3]
            Array.prototype.unique = function () {
    
                //创建一个数组存放
                var temp = [this[0]]
    
                for(var i = 1; i < this.length;i++){
                    var isRepeat = false // 默认当前不重复
                    for(var j = 0; j < temp.length; j ++){
                        if(this[i] == temp[j]){
                            isRepeat = true
                            break;
                        }
                    }
                    if(!isRepeat){
                        temp.push(this[i])
                    }
                }
    
                return temp;
            }
    
            console.log(a)
            a.unique()
            console.log( a.unique())
    View Code

    方法2:

    1.先将原数组进行排序

    2.检查原数组中的第i个元素 与 结果数组中的最后一个元素是否相同,因为已经排序,所以重复元素会在相邻位置

    3.如果不相同,则将该元素存入结果数组中

     // 方法2
            Array.prototype.unique2 = function (){
    
                //创建一个数组存放
                var temp = [this[0]]
    
                // 对原数组进行排序
                this.sort()
    
                for(var i = 1; i < this.length;i++){
    
                    this[i] != temp[temp.length - 1] && temp.push(this[i])
    
                }
    
                return temp
    
            }
    View Code

    方法3:

    1.先将原数组进行排序

    2.检查原数组中的第i个元素 与 结果数组中的最后一个元素是否相同,因为已经排序,所以重复元素会在相邻位置

    3.如果不相同,则将该元素存入结果数组中

    // 方法3  时间复杂度O(n) = n
            Array.prototype.unique3 = function (){
                //创建一个数组存放
                var temp = []
                var obj  = {}
    
                for(var i = 0; i < this.length;i++){
    
                    if(!obj[this[i]]){
                        temp.push(this[i])
                        obj[this[i]] = 1
                    }
                }
                return temp
            }
    View Code

    方法4:这个方法跟方法3一样,只是我觉得,为什么要创建一个对象来存放呢,只是存放一个值,那么一维数组是不是也可以实现。查了一下数组和对象的区别,觉得像这样不需要循环的时候,又只需要存一个数字的时候,数组和对象其实是一样的。

     // 方法4 时间复杂度O(n) = n
            Array.prototype.unique4 = function (){
                //创建一个数组存放
                var temp = []
                var obj  = []
    
                for(var i = 0; i < this.length;i++){
    
                    if(!obj[this[i]]){
                        temp.push(this[i])
                        obj[this[i]] = 1
                    }
                }
                return temp
            }
    View Code

    比较这几个方法的运行时间,

    依次应该为:

    方法1:O(n) = n*n

    方法2:O(n) = n + O(sort())

    方法3:O(n) = n 

    方法4:O(n) = n 

    当随机生成一个长度为10000000数组,打印这几个的运行时间

    如下图所示:

    经过多次打印,方法3和方法4都是差不多的。都可以使用。

    原文地址:http://www.jb51.net/article/46154.htm

    
    
  • 相关阅读:
    Dockerfile简介及基于centos7的jdk镜像制作
    docker数据卷(Data Volumes)
    docker入门及常用命令
    Failed to start bean ‘org.springframework.kafka.config.internalKafkaListenerEndpointRegistry
    dubbo服务启动报:qos-server can not bind localhost:22222s
    Dubbo服务调用Failed to invoke the method错误记录
    java8-list转Map
    git remote: HTTP Basic: Access denied 错误解决办法
    SSH整合(二)
    SSH整合
  • 原文地址:https://www.cnblogs.com/i-jia/p/5367434.html
Copyright © 2011-2022 走看看