面试题3:数组中重复的数字

2019-02-21  本文已影响0人  IvyAutumn

测试用例:

解决思路一

先排序:使用数组的sort(fun)方法,注意对数字排序需要自己写一下fun方法。
从头到尾扫描排序后的数组。若相邻两个数相同,则该数组中有重复的数字。

 function findReNumber(arr) {
    if(arr.length == 0){
        return false;
    }

    arr.every(function(x){
        return x>=0 && x<arr.length;
    })
    arr.sort(function(a,b){
        return (a-b);
    });
    
    for(var i = 0; i<arr.length-1;i++){
        if(arr[i]===arr[i+1]){
            return true;
        }
    }
    return false;
 }

解决思路二

利用哈希表。使用Set可以达到目的。
遍历,每遍历到一个数字的时候如果表中没有这个数字,则加入;如果有这个数字,则表明重复。
算法的时间复杂度为O(n),但是它提高时间效率是以一个大小为O(1)的哈希表为代价的。

 function findReNumber(arr) {
    if(arr.length == 0){
        return false;
    }

    arr.every(function(x){
        return x>=0 && x<arr.length;
    })
    var set = new Set();
    for(var i=0; i<arr.length;i++){
        if(set.has(arr[i]))
            return true;
        else
            set.add(arr[i]);
    }
    return false;
 }

解决思路三

重排数组的方法,能够实现时间复杂度为O(n),空间复杂度为O(1)

const findDuplicate = (arr,length) => {
    if(arr=null||length<=0)
        return false;
    for(let val of arr){
        if(var<0 || var>n-1)
            return false;
    }

    for(let i = 0; i < length; i++){
        while(arr[i]!=i){
            if(arr[i]==arr[arr[i]]){
                return true;
            }else{
                [arr[i],arr[arr[i]] = [arr[arr[i], arr[i]];
            }
        }
    }

    return false;
} 
上一篇 下一篇

猜你喜欢

热点阅读