数据结构及算法

来源:互联网 发布:明星页游 知乎 编辑:程序博客网 时间:2024/06/05 16:16

最近在填上学时留下的坑,工作以后就疲于应付各种业务代码,越来越觉得,要想真正的提高自己,一定要有扎实的基础,所以抓起了数据结构及算法。
接触算法,想必一定会接触约瑟夫问题:

据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。
详细介绍请参考 百度百科

Josephus是如何逃过这个死亡游戏的呢?网上有很多java、C、C++版本,我结合最近学习的单循环链接,写了一个javascript版本

// 链表节点class Node {    constructor(element) {        this.element = element        this.next = null    }}class LoopLinkedList {    constructor(){        this.head = null        this.length = 0    }    append(element){        const node = new Node(element)        let current = null        if (this.length == 0) {            this.head = node            node.next = this.head        } else {            let index = 1            current = this.head            while(index < this.length){                current = current.next                index++            }            current.next = node            node.next = this.head        }        this.length++    }    killPeople(setpCount,survivalCount) {        /*        setpCount : 跨过的人数        survivalCount : 最终留下的人数        */        let current = this.head //初始化        let totalCount = this.length    //总人数        let counter = 1     //计数器        let killedIds = ""   //被杀死的id        while(totalCount > survivalCount) {            if (counter == 3) {                if (current.element.killed) {                    current = current.next                } else {                    current.element.killed = true                    killedIds += " " + current.element.id                    current = current.next                    totalCount--                    counter=1                }            } else {                if (!current.element.killed) {                    counter++                }                current = current.next            }        }        console.log(killedIds + " were been killed")    }    whoSurvived(){        console.log("--------------------whoSurvived------------------------")        let current = this.head        let index = 1        while(index <= this.length){            if (!current.element.killed) {                console.log(current.element.id + " sruvived")            }            current = current.next            index++        }    }    // 转为字符串    toString() {        let current = this.head        let string = ''        let index = this.length        while (index--) {            string += ` ${current.element.id}`            current = current.next        }        return string    }}const CL = new LoopLinkedList()for (var i = 1; i <= 41; i++) {    CL.append({id:i,killed:false})}CL.killPeople(2,2)CL.whoSurvived()

运行结果如下:

 3 6 9 12 15 18 21 24 27 30 33 36 39 1 5 10 14 19 23 28 32 37 41 7 13 20 26 34 40 8 17 29 38 11 25 2 22 4 35 were been killed--------------------whoSurvived------------------------16 sruvived31 sruvived

查看在线demo

原创粉丝点击