7. Joseph问题

问题本身我两句话也说不明白,直接截图了。


目前公式的推导还没想明白。自己先写了一个模拟这个过程的程序,最后得到的幸存者的位置是对的。

整个过程非常简单。
就是指针每向前走两次,就把当前的那项删除。
删除后退回到上一项,继续往前走。

/**
 * Created by creat on 2018/8/4.
 */
public class JosephProblem {
    private class ListNode {
        int val;
        ListNode next;
        ListNode(int val) {
            this.val = val;
        }
    }

    /**
     * make a circle and return the last member
     */
    private ListNode createListStartFromTail(int size) {
        ListNode dummy = new ListNode(-1);
        ListNode curr = dummy;
        for (int i = 1; i <= size; i++) {
            curr.next = new ListNode(i);
            curr = curr.next;
        }
        curr.next = dummy.next;
        return curr;
    }

    private void removeCurrNode(ListNode prev, ListNode curr) {
        prev.next = curr.next;
        curr.next = null;
    }

    private ListNode simulateJosephProblem(int size) { 
        int stepCount = 0;
        ListNode tail = createListStartFromTail(size);
        ListNode cur = tail;
        while (cur.val != cur.next.val) { // until there is a survivor
            ListNode prev = cur;
            cur = cur.next;
            stepCount++;
            if (stepCount % 2 == 0) {
                removeCurrNode(prev, cur);
                cur = prev; // if current node is removed, it should step back for the next iteration.
            }
        }
        return cur;
    }

    public static void main(String[] args) {
        JosephProblem jp = new JosephProblem();
        System.out.println(jp.simulateJosephProblem(40).val); //17
        System.out.println(jp.simulateJosephProblem(15).val); //15
        System.out.println(jp.simulateJosephProblem(10).val); //5
        System.out.println(jp.simulateJosephProblem(1).val);  //1
        System.out.println(jp.simulateJosephProblem(2).val);  //1
        System.out.println(jp.simulateJosephProblem(3).val);  //3
        System.out.println(jp.simulateJosephProblem(4).val);  //1
        System.out.println(jp.simulateJosephProblem(5).val);  //3
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 欢迎关注我的公众号:读书主义 更多精彩等着你! 这个读书方法,可能会颠覆你对读书以往的认知|开卷 或许读书已经成为...
    米米粒粒阅读 34,914评论 9 209
  • 这个读书方法,可能会颠覆你对读书以往的认知|开卷 或许读书已经成为你的一种生活方式,在读书中也构建了一个属于自己的...
    yuqifuli阅读 5,550评论 3 13
  • 七以后的世界。Theworldafter7. 文 / 陈曦 1(羽园.抵达)2012.2.19 可是那又有什么用呢...
    ZealotP阅读 439评论 0 1
  • 作者:程序猎人 发表于《科幻世界》 2013.09 微雨。遗体告别大厅。肖城的目光越过恩师李焱的遗体,望见对面的她...
    程序猎人阅读 5,047评论 16 8
  • ![Flask](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAW...
    极客学院Wiki阅读 7,459评论 0 3