面試題(一)

若干個數字,怎麼選出最大的五個

方法一

	let arr=[];
    arr.length=10000000;
    for(let i=0,len=arr.length; i<len; i++){
        arr[i]=Math.ceil(Math.random()*10000)
    }
    function max(arr){
        arr.sort((a,b)=>{
            if(a<b){
                return 1
            }else {
                return -1
            }
        })
        return arr.slice(0,5)
    }
    let dete=new Date().getTime()
    console.log(max(arr));
    console.log(new Date().getTime() - dete);

最簡單最直接但是效率最低的辦法,把數組排序,去最大的5個

方法二

let arr=[];
    arr.length=10000000;
    for(let i=0,len=arr.length; i<len; i++){
        arr[i]=Math.ceil(Math.random()*10000)
    }
    function max(arr){
        let num=arr.length
        if(num<=5){//長度小於五直接返回
            return arr
        }else{//長度大於五,把數組分成兩個數組,再去尋找每個數組最大的五個數
            let arr1=arr.slice(0,Math.ceil(num/2)),arr2=arr.slice(Math.ceil(num/2),num)
            if(arr1.length<=5&arr2.length<=5){//分成兩個後的長度都小於五,直接在這兩個數組中找出最大的五個數
                let res=arr1.concat(arr2);
                res.sort((a,b)=>{
                    if(a<b){
                        return 1
                    }else {
                        return -1
                    }
                })
                return res.slice(0,5)
            }else {//否則分別求出這兩個數組的最大的五個數,再進行計算  其實此處可以再細分成某一個長度大於五的情況,影響不大
                let res=max(arr1).concat(max(arr2));
                res.sort((a,b)=>{
                    if(a<b){
                        return 1
                    }else {
                        return -1
                    }
                })
                return res.slice(0,5)
            }
        }
    }
    let dete=new Date().getTime()
    console.log(max(arr));
    console.log(new Date().getTime() - dete);

利用函數遞歸,將原數組無線分組再來找最大的五個數,該方法節省了數組排序的時間
如果數組長度不大,兩個方法的執行時間差不多;但是如果數組長度像我寫的有一千萬甚至上億的時候差別就顯示出來了,當長度爲一千萬,方法一的計算時間爲18秒左右,而方法二的計算時間只有6秒

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章