当前位置: 首页 > news >正文

约瑟夫环算法的几种实现方式,最简单方式,一行代码实现

简介:
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。
分析:
(1)由于对于每个人只有死和活两种状态,因此可以用布尔型数组标记每个人的状态,可用true表示死,false表示活。
(2)开始时每个人都是活的,所以数组初值全部赋为false。
(3)模拟杀人过程,直到所有人都被杀死为止。
1.使用链表循环遍历的形式
   n代表多少个人,m代表编号为M的人:
    public int josephRing1(int n, int m) {
        LinkedList<Integer> list = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            list.add(i);
        }
        int bt = 0;
        while (list.size() > 1) {
             删除为m-1的人(从0开始)
            //解析看前面
            bt = (bt + m - 1) % list.size();
            list.remove(bt);
        }
        return list.size() == 1 ? list.get(0) : -1;
    }

2.使用递推公式

n代表多少个人,m代表编号为M的人:

 

public int josephRing2(int n, int m) {
        if (m < 1 || n < 1)
            return -1;
        int last = 0;
        // i代表有目前有几个人
        for (int i = 2; i <= n; i++)
            last = (last + m) % i;
        return last;
    }

 

3.使用递归调用

public int josephRing3(int n, int m) {
        if (n == 1) return n;
        return (josephRing3(n - 1, m) + m) % n + 1;
    }

4.最简单的实现方式,一行代码实现

 public int josephRing(int n, int m) {
        return n == 1 ? n : (josephRing(n - 1, m) + m) % n + 1;

    }

 

 

 

转载于:https://www.cnblogs.com/jwanqiang/p/11511948.html

相关文章:

  • NPM——npm|cnpm如何升级
  • Nginx——报错汇总
  • 贪心算法基础
  • ElementUI——报错汇总
  • ElementUI——动态表单验证
  • CSP-S 46 题解
  • maven引入本地jar包的方法
  • jmap错误:unknown CollectedHeap type : class sun.jvm.hotspot.gc_interface.CollectedHeap
  • nginx retryfiles
  • gitlab 构建常见错误
  • PS——使用切片工具切出透明图片
  • 从零开始部署CloudSim4.0云计算仿真平台
  • Ubuntu 16.04 64位 安装NVIDIA驱动 CUDA9.1和PyTorch
  • 从零开始部署Guns V4.0 (SpringBoot开源框架)教程
  • 云计算:数据中心之虚拟机
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Android交互
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • IndexedDB
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Javascript Math对象和Date对象常用方法详解
  • Java到底能干嘛?
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • php ci框架整合银盛支付
  • PHP的Ev教程三(Periodic watcher)
  • Redux 中间件分析
  • SpiderData 2019年2月13日 DApp数据排行榜
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 成为一名优秀的Developer的书单
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 解析 Webpack中import、require、按需加载的执行过程
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 移动端 h5开发相关内容总结(三)
  • 用Canvas画一棵二叉树
  • 终端用户监控:真实用户监控还是模拟监控?
  • ​2021半年盘点,不想你错过的重磅新书
  • (11)MATLAB PCA+SVM 人脸识别
  • (2)(2.10) LTM telemetry
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (十六)一篇文章学会Java的常用API
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)socket Aio demo
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ..回顾17,展望18
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core WebAPI中使用Log4net 日志级别分类并记录到数据库
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 指南:抽象化实现的基类
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .pop ----remove 删除