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

文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

相关文章:

  1. LeetCode:55. Jump Game(跳远比赛)
  2. Leetcode:300. Longest Increasing Subsequence(最大增长序列)
  3. LeetCode:560. Subarray Sum Equals K(找出数组中连续子串和等于k)

文章目录:

问题描述:

java实现方式1:

python实现方式1:

源码地址:


问题描述:

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


java实现方式1:


package JosephProblem;

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

/**
*@description:约瑟夫环问题
*@author: 张宇
 */
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 josephList = new ArrayList();
	  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);
   }
}

python实现方式1:

# encoding='utf-8'
'''
author:zhangyu
date:2019.7.23
description:计算约瑟夫环问题
'''
def joseph_problem(number_n, start_number_k, number_m):
    joseph_arr = []
    for i in range(1, number_n + 1):
        joseph_arr.append(i)
    start = start_number_k
    length = len(joseph_arr)

    for j in range(length - 1):
        start = (start + number_m) % len(joseph_arr)
        joseph_arr.pop(start)
    return joseph_arr[0]


if __name__ == '__main__':
    last_number = joseph_problem(1000, 5, 13)
    print(last_number)

运行结果:

939

源码地址:

https://github.com/zhangyu345293721/leetcode

你可能感兴趣的:(java基础,LeetCode)