一個隨機排布的面試題(洗牌算法?)

去某公司面試遇到一個這樣的題:“班裏有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,應該是沒有

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