一个随机排布的面试题(洗牌算法?)

本文介绍了在面试中遇到的一道题目,要求对1到62的学号进行随机排列,确保相邻的学号不相邻。通过遍历和递归的方法来解决这个问题,采用从头尾插入的策略防止最后出现61和62相邻的情况。代码实现中可能存在调用上的复杂性,但逻辑上应无误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

去某公司面试遇到一个这样的题:“班里有62个学生,学号分别为1-62,新学期随机排座位,要求学号相邻的不能坐在一起”
个人解读:一个数组有1-62个数字,要求随机排序,数字相邻的不能挨在一起。

肯定是遍历啊,遍历一遍可能不会安排完数组里所有的值,所以需要递归调用。为了避免安排完最后剩下两个数61,62所以采取从头尾两次插入的方法。

        var  arr =new Array(62).fill(0).map((_,k)=>k+1);

        function randomSort(arr,target){
            if(!Array.isArray(arr) || arr.length==0) return target;
            for(var i=arr.length;i>0;i--){
                var index = Math.floor(Math.random()*i);
                if(target.length>0){
                    //判断最后一个是不是跟随机取出来的相邻
                    if(target[target.length-1]+1!=arr[index] && target[target.length-1]-1!=arr[index]){
                        target.push(arr[index]);
                        arr.splice(index,1)
                    }else if(target[0]+1!=arr[index] && target[0]-1!=arr[index]){
                        //再判断第一个是不是跟他相邻
                        target.unshift(arr[index])
                        arr.splice(index,1)
                    }
                }else{
                    target.push(arr[index])
                    arr.splice(index,1)
                }

            }

            return target.concat(randomSort(arr,target));

        }

        console.log(randomSort(arr,[]))    //上边那种写法

改变一下写法,调用的时候有点难看

        var  arr =new Array(62).fill(0).map((_,k)=>k+1);
        function randomSort(arr){
            if(!Array.isArray(arr) || arr.length==0) return [];
            var target = [];
            for(var i=arr.length;i>0;i--){
                var index = Math.floor(Math.random()*i);
                if(target.length>0){
                    //判断最后一个是不是跟随机取出来的相邻
                    if(target[target.length-1]+1!=arr[index] && target[target.length-1]-1!=arr[index]){
                        target.push(arr[index]);
                        arr.splice(index,1)
                    }else if(target[0]+1!=arr[index] && target[0]-1!=arr[index]){
                        //再判断第一个是不是跟他相邻
                        target.unshift(arr[index])
                        arr.splice(index,1)
                    }
                }else{
                    target.push(arr[index])
                    arr.splice(index,1)
                }

            }

            return target.concat(randomSort(arr));

        }

        console.log(randomSort(arr)) 

不知道有没有bug,应该是没有

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值