zoukankan      html  css  js  c++  java
  • Solution 18: 约瑟夫环问题

    问题描述

    n个数字(0,1,...,n-1)形成一个圆圈,从数字0开始。每次从这个圆圈中删除第m个数字,然后从被删除的下一个继续删除第m个元素,以此类推。

    直到最后剩下一个数字,求出该数字。

    解决思路

    1. 使用循环链表模拟这一过程,计数器计数;

    2. 递归思路

    (图片来源:http://www.cnblogs.com/yangyh/archive/2011/10/30/2229517.html)

    程序

    public class JosephLoop {
    	public int josephLoopByList(int n, int m) {
    		if (n <= 0 || m <= 0) {
    			return -1;
    		}
    
    		int cnt = n;
    		boolean[] p = new boolean[n];
    		int k = 0;
    
    		while (cnt > 1) {
    			for (int i = 0; i < p.length; i++) {
    				if (!p[i]) {
    					++k;
    					if (k == m) {
    						p[i] = true;
    						--cnt;
    						k = 0;
    					}
    				}
    			}
    		}
    
    		for (int i = 0; i < p.length; i++) {
    			// get the last one
    			if (!p[i]) {
    				return i + 1;
    			}
    		}
    
    		return -1;
    	}
    	
    	// recursion
    	public int josephLoopRec(int n, int m) {
    		if (n <= 0 || m <= 0) {
    			return -1;
    		}
    		return helper(n, m, n) + 1;
    	}
    
    	private int helper(int n, int m, int i) {
    		if (i == 1) {
    			return (m - 1) % n;
    		}
    		return (helper(n - 1, m, i - 1) + m) % n;
    	}
    }
    

      

  • 相关阅读:
    第三章 Jenkins参数及web项目
    第二章 Jenkins的详细介绍
    第一章 Git+Gitlab介绍和安装
    第二章 Centos7下Airflow2.1.0安装
    第一章 Airflow基本原理
    第五章 Pinpoint-Apm常见报错
    第四章 Docker方式安装 Pinpoint
    数论练习
    CF练习
    矩阵乘法
  • 原文地址:https://www.cnblogs.com/harrygogo/p/4623591.html
Copyright © 2011-2022 走看看