约瑟夫问题

本文介绍了一个经典的数学应用问题——约瑟夫环,并提供了一种解决方案。通过使用ArrayList存储人员编号并结合HashMap记录每个编号对应的随机值,实现了每隔两个数删除一个数的过程,直至最后剩下一人。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
//约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
//从编号为k的人开始报数,数到m的那个人出列;
//他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
/**
 * 题目:有一个整型数组a[n]顺序存放0 ~ n-1,要求每隔两个数删掉一个数,
 * 到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。
*
 */
public class Yuesefu {
    public static void main(String[] args) {
        yue(10,3,1);//元素个数,间隔个数,开始位置
    }
    
    public static void yue(int total,int count,int no){
        HashMap<Integer,Object> map = new HashMap<>();
        ArrayList<Integer> list = new ArrayList<>();
        for(int i=1;i<total+1;i++){
            list.add(i);
            map.put(i,(int)(Math.random()*10));
        }
        System.out.println(list);
        int k = no-1 + count - 1;//删除元素的下标:首次下标+间隔 -1
        while(list.size() > 1){
            if(k > list.size()-1){//需要回环
              k = k - (list.size()-1) -1;//计算下标
            }
            System.out.println(list.get(k));
            list.remove(k);
            k = k+count-1; //计算下标
            System.out.println(list);
        }
        Collection<Object> values = map.values();
        for (Object object : values) {
            System.out.print(object+"|");
        }
        System.out.println();
        System.out.println("原始下标:"+list.get(0)+"\n值为:"+map.get(list.get(0)));
    }
    
}

转载于:https://www.cnblogs.com/caoyajun33-blog/p/7505800.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值