LeetCode:1.关于约瑟夫环问题

问题描述:约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知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: 张宇
*@date: 日期: 2018年8月16日 时间: 下午9:05:54
*@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

 

点赞