LeetCode:Joseph Problem(关于约瑟夫环问题)

问题描述:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人只有一个没有出列。假设n=1000,k=5,m=13,问剩下最后一个人编号。

实现代码:

package JosephProblem;

import java.util.ArrayList;
import java.util.List;
import org.junit.Test;

/**
*类描述:约瑟夫环问题!
*@author: 张宇
*@version 1.0
 */

public class TestJosephProblem {
  @Test
  public void testJosephProblem() {  
	 int lastNumber = josephProblem(1000,5,13);
	 System.out.println(lastNumber);
  } 

  //约瑟夫环算法,经典求解,动态减去链表中元素
  public int josephProblem(int numberN, int startNumberK, int numberM) {
	//定义一个链表,让链表里面存1...1000个数	
	  List<Integer> josephList = new ArrayList<Integer>();
	  for(int i = 1;i <= numberN; i++) {
		  josephList.add(i);
	  }
	  int start = startNumberK;
	  int length = josephList.size();
	  for(int i = 1;i < length; i++) {
		  start = (start+numberM) % josephList.size();
		  josephList.remove(start);
	  }
	  return josephList.get(0);
   }
}

运行结果:

939

源码github地址:https://github.com/zhangyu345293721/leetcode

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/zy345293721/article/details/81749015
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞