学习记录——Java 报数-Josephus Problem

题目

有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子,问最后留下的是原来第几号的那位。

这是一个经典的约瑟夫环问题,网上也有很多解答……我理解了题目的意思,但是还是不知道该咋写…
但是网上方法基本上是两种 :

  1. 模拟约瑟夫环;
    基本也是用的循环链表的数据结构。
    这题参考了两个b站视频……然后跟着敲了一遍
    贴上:约瑟夫环1—用了java 的LinkedList类
    约瑟夫环2—自己构建一个了循环链表数据结构

    还可以看一下c语言的实现:c语言实现 ,视频里还有用循环队列实现的- - 改日再写吧得赶紧把剩下的搞完

  2. 数学方法

以下

第一种

import java.util.*;
public class Problem37 {
   
    public static int Josephus(int n , int m ){
   
        if( n == 0 || m ==0)
            return -1;
        LinkedList<Integer> list = new LinkedList<> ();
        //构建一个链表
        for(int i =1; i<=n; i++){
   
            list.add(i);     //在链表后面插入
        }
        //打印链表,可以直接打印,也可以用list.get()一个个获取
        System.out.println(list);
        System.out.println();
        int removeIndex = 0;   //removeIndex为需要移除的下标
        while(list.size() !=1){
      //当list不为空时
            removeIndex = (removeIndex + m -1) % list.size()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值