美文网首页
约瑟夫斯环 - 一个凄美的故事

约瑟夫斯环 - 一个凄美的故事

作者: 尤小小 | 来源:发表于2019-01-16 14:43 被阅读3次

传说在公元1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40 个同胞被罗马士兵包围。犹太士兵决定宁可自杀也不做俘虏,于是商量出了一个自杀方案。他们围成一个圈,从一个人开始,数到第三个人时将第三个人杀死,然后再数,直到杀光所有人。约瑟夫和另外一个人决定不参加这个疯狂的游戏,他们快速地计算出了两个位置,站在那里得以幸存。请问哪两个位置?写一段程序将n个人围成一个圈,并且第m个人会被杀掉,计算一圈人中哪两个人会存活。使用循环链表解决该问题。

{
//Node对象定义
function Node(element) {
    this.element = element;
    this.next = null;
}
//LList对象定义
function LList() {
    this.head = new Node("head");
    this.find = find;
    this.insert = insert;
    this.remove = remove;
    this.findPrevious = findPrevious;
    this.display = display;
}

function find(item) {
    var currNode = this.head;
    while (currNode.element != item) {
        currNode = currNode.next;
    }
    return currNode;
}

function insert(element, item) {
    var newNode = new Node(element);
    var current = this.find(item);
    newNode.next = current.next;
    current.next = newNode;
}

function findPrevious(item) {
    var current = this.head;
    while (current.next.element != item && current.next != null) {
        current = current.next;
    }
    return current;
}

function remove(item) {
    var prevNode = this.findPrevious(item);
    if (prevNode.next != null)
        prevNode.next = prevNode.next.next;
}

function display() {
    var str = "";
    var current = this.head;
    while (current.next != null) {
        str += current.next.element + "\n";
        current = current.next;
    }
    return str;
}

function Node(element) {
    this.element = element;
    this.next = null;
}

function LList(num) {
    var head = new Node(1);
    var p = head;
    for (var i = 2; i <= num; i++) {
        var temp = new Node(i);
        p.next = temp;
        p = temp;
    }
    p.next = head;
    return head;
}

var cirLinkList = new LList(42);

var current = cirLinkList;

var arr = [];
// console.log(current.next.next.next)

// 每次遍历删除一个节点
while (current.next.next != current) {
    for (var i = 1; i < 4; i++) {
        var parent = current;
        current = current.next;
    }
    //删除节点的本质即改变其前一个元素的后继
    parent.next = current.next; // 删除节点
    arr.push(current.element); // 存储删除的节点数据
    current = parent.next; // 更新当前元素
}

console.log(current)

let tempArr = arr.sort(function (a, b) { 
    return a - b 
})

console.log(tempArr)

}

相关文章

  • 约瑟夫斯环 - 一个凄美的故事

    传说在公元1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40 个同胞被罗马士兵包围。犹太士兵决定宁可自...

  • 算法--约瑟夫斯环

    n个人围成一个圆圈,编号为1~n,从第一号开始报数,报到m的倍数的人离开, 一直数下去,直到最后只有一个人, 求此人编号

  • 约瑟夫斯环问题

    大体思路是使用循环链表结合一个带模的计数器,计数器递增的同时链表向前遍历,计数器抵达指定次数时将链表当前节点从环中...

  • 约瑟夫环问题

    约瑟夫环问题约瑟夫环描述:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围...

  • 用队列解决约瑟夫环问题-Python

    已发布于同名公众号:车湾里 什么是约瑟夫环问题 约瑟夫问题 ,有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学...

  • 循环单链表实现约瑟夫环(C语言)

    约瑟夫环

  • 约瑟夫环

    题目:100名学生围成一个圈, 编号从1到100,从第一名学生开始报数,从1-9报数 每报出9就退出,直到所有学生...

  • 约瑟夫环

  • 约瑟夫环

    问题:1~n个人围成一圈,从1开始报数,每次数到m这个人就出列,问最后剩下的是几号? 做法:递归。 假设剩下的是f...

  • 约瑟夫环

    解法一 用一个list模拟删除过程 解法二 数学公式,推到过程还没看懂

网友评论

      本文标题:约瑟夫斯环 - 一个凄美的故事

      本文链接:https://www.haomeiwen.com/subject/rndmdqtx.html