• 数组去重


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

    方法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

    
    
  • 相关阅读:
    ASP.NET 防盗链的实现[HttpHandler]
    html打印表格每页都有的表头和打印分页
    spring是怎样管理mybatis的及注入mybatis mapper bean的
    浅谈Log4j和Log4j2的区别
    git tag — 标签相关操作
    java cocurrent包
    线程实现异步
    使用Shell脚本查找程序对应的进程ID,并杀死进程
    shell脚本监测文件变化
    spring boot的几种配置类型
  • 原文地址:https://www.cnblogs.com/i-jia/p/5367434.html
Copyright © 2020-2023  润新知