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

    
    
  • 相关阅读:
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 Cowboys
    Java实现 蓝桥杯 算法训练 Cowboys
    55. Jump Game
    54. Spiral Matrix
    50. Pow(x, n)
  • 原文地址:https://www.cnblogs.com/i-jia/p/5367434.html
Copyright © 2011-2022 走看看