面试题(一)

若干个数字,怎么选出最大的五个

方法一

	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秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值