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

来源:互联网 发布:西门子840d编程手册书 编辑:程序博客网 时间:2024/05/18 07:40

去某公司面试遇到一个这样的题:“班里有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,应该是没有