注册 登录
编程论坛 JavaScript论坛

基于数组实现队列的问题,在求解 击鼓传花 时遇到问题,求大神帮看代码

手工馒头 发布于 2022-04-03 23:29, 1624 次点击
//几个朋友玩一个游戏,围成一个圈,开始数数,数到某个数字时,对应位置的人淘汰,直到只剩一个人时游戏结束,并求出剩余的那一个人原来的位置
    // 基于数组封装队列,该方法性能不高,只为学习
    function Queue(){
        this.list = []
        Queue.prototype.enqueue = function(params){
            this.list.push(params)
        }
        Queue.prototype.dequeue = function(){
            this.list.shift()
        }
        Queue.prototype.front = function(){
            return this.list[0]
        }
        Queue.prototype.size =function(){
            return this.list.length
        }
        Queue.prototype.isEmpty = function(){
            return this.list.length === 0
        }
        Queue.prototype.toString = function(){
            let s = ''
            for(var i = 0; i < this.list.length; i++){
                s += this.list[i] + ' '
            }
            return s
        }
    }

//nameList为玩游戏的人组成的数组, num为数到的数字
//思路:1、num之前的人不会被淘汰,放入队列最后面。  2、删除num位置的元素。  3、从新开始数数,重复1、2步骤,直到队列中仅剩一人  
 function DrummingToPassFlowers(nameList, num) {
        // 1、创建队列
        var queue = new Queue();
        // 2、将数组nameList中的元素添加进队列中
        nameList.forEach(item => {
           queue.enqueue(item)
        })
        // 5、重复执行3、4,直到队列中只剩一人
        while(queue.size() > 1){
           // 3、将num之前的元素添加到队列末尾
           for(var i = 0; i < num-1; i++){
               // 经验证,此处出问题,但是不知道为什么
               queue.enqueue(queue.dequeue())
           }
           // 4、删除num位置的元素
           queue.dequeue()
        }
        var endName = queue.front()
        return nameList.indexOf(endName)
    }
    var na = ['qoqo', 'wowo', 'eoeo', 'roro', 'toto', 'yoyo']
    alert(DrummingToPassFlowers(na, 4));
1 回复
#2
hugeannex2023-12-19 11:41
不太明白怎么玩,但
如:[1,2,3,4],num=3,则要把1,2添加到队列末尾,你的方法就出问题了。
for第一轮时,结果 [4,1,2]
然后while仍大于1,又下一轮
for的条件 num-1仍为2了,最后删了2,结果为。。。乱的。。。
即num-1这个条件不对,可能超出了人员的长度。
1