约瑟夫环问题解法

问题描述:N个人围成一圈,从第一个人开始报数,报m数的人出圈,剩下的人继续从1开始报数,报到m数的人再出圈;如此往复,直到所有人出圈。(模拟此过程,输出出圈的人的序号)

public static void yesefu(int totalNum, int countNum) {
		// 初始化人数
		ArrayList<Integer> start = new ArrayList<Integer>();
		for (int i = 1; i <= totalNum; i++) {
			start.add(i);
		}

		int k = 0;// 数组下标从0开始
		while (start.size() > 0) {
			k = k + countNum;
			// 第m人的索引位置
			k = k % (start.size()) - 1;// 数组下标从0开始 进行取余是因为防止k大于圈中人的总数
			// 判断是否到队尾,即k的大小为start的大小,此时k为-1
			if (k < 0) {
				// 如果到队尾了,则输出队尾元素
				System.out.print(start.get(start.size() - 1) + " ");
				start.remove(start.size() - 1);
				k = 0;
			} else {
				// 否则直接输出k对应位置的元素
				System.out.print(start.get(k) + " ");
				start.remove(k);
			}
		}
	}

	public static void main(String[] args) {
		yesefu(10, 3); 
		//3 6 9 2 7 1 8 5 10 4 
		//最后活下来的是4号
	}
发布了185 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_39309402/article/details/102702683