• 教你使用java彻底掌握 “约瑟夫环”


    1.约瑟夫环的由来:

    ​ 据说著名犹太历史学家约瑟夫(Josephus)有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而约瑟夫和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终只剩下一个人留下,这个人就可以继续活着。问题是,给定了和,一开始要站在什么地方才能避免被处决。Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

    2.通俗解释:

    ​ 就是41个人围城一个圈,每一个人的位置都代表一个数字。从一个位置开始报数,只要是3的倍数就要被旁边的人杀掉,如果那个位置的人被杀掉就跳过那个人的位置继续报数。请问最后活下来的人的位置是几号?在小编看来如此精辟的游戏丝毫不亚于“俄罗斯轮盘”-----真是紧张又刺激哦!不过也从侧面说明了一个问题,脑子真是个好东西!后来-------"电脑"出现了。幸运的是,能读到这篇文章的朋友毫无疑问都是有 "电脑子"的人。相信在看完这篇文章之后----“你我皆是约瑟夫”!!!

    在这里插入图片描述

    3.java实现思路

    面对此类在java当中,毫无疑问最现想到的是数组,但是受制于数组的不易增删元素的特性,我们瞬间想到了ArrayList集合.

    步骤:

    ​ -1.定义一个记录数的变量,用于对是否为3的位置信息进行判定。

    ​ -2.建立一个ArrayList集合将每个人所代表的位置数通过遍历元素的方式传入集合当中

    ​ -3.定义一个变量用于对索引值进行动态调整(这里我们叫他指针)

    ​ -4.通过for循环遍历的方式对符合条件的元素进行筛选操作集合对象对于元素的选择

    在这里插入图片描述

    4.代码实现

    import java.util.ArrayList;
    
    public class demo7 {
        public static void main(String[] args) {
            System.out.println("最幸运的数字:"+getLucklyNum(41));
        }
       /*
       获取幸运数字的方法
       1.返回值类型int
       2.类型参数为int num
        */
        public static int getLucklyNum(int num){
         ArrayList<Integer> list = new ArrayList<>();//创建集合存储1~num的对象
            for(int i=1;i<=num;i++){
    
                list.add(i);//将1~num存储在集合当中
            }
          int count=1;//用来数数的,只要是3的倍数就杀人
            int i;//定义一个指针也是用于控制删除元素所用
            for(i=0;list.size() !=1;i++){ //只要集合中人数超过1就要不断的杀,i就相当于指针
                if(i==list.size()){//如果i增长到list集合最大的索引+1时就重新归0(当一轮筛选后将指针重回0继续筛选)
                    i=0;
                }
                if(count %3==0){//如果是3的倍数(只是针对索引值,而不是每个数的值)就杀人
                    System.out.println("i的值:"+i);
                    list.remove(i--);//与list.remove(i)一样只不过i自身进行了减一也就是i的值回到了2。
                    System.out.println(list);
                }
                count ++;//count数继续增加
                System.out.println("count的值:"+count);//输出count的值看是否符合规律
            }
           return list.get(0);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    运行结果如下图所示:

    count的值:2
    count的值:3
    i的值:2
    集合所剩元素:[1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
    count的值:4
    count的值:5
    count的值:6
    i的值:4
    集合所剩元素:[1, 2, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
    count的值:7
    count的值:8
    count的值:9
    i的值:6
    集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
    count的值:10
    count的值:11
    count的值:12
    i的值:8
    集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
    count的值:13
    count的值:14
    count的值:15
    i的值:10
    集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
    count的值:16
    count的值:17
    count的值:18
    i的值:12
    集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
    count的值:19
    count的值:20
    count的值:21
    i的值:14
    集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
    count的值:22
    count的值:23
    count的值:24
    i的值:16
    集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
    count的值:25
    count的值:26
    count的值:27
    i的值:18
    集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
    count的值:28
    count的值:29
    count的值:30
    i的值:20
    集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
    count的值:31
    count的值:32
    count的值:33
    i的值:22
    集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 36, 37, 38, 39, 40, 41]
    count的值:34
    count的值:35
    count的值:36
    i的值:24
    集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 39, 40, 41]
    count的值:37
    count的值:38
    count的值:39
    i的值:26
    集合所剩元素:[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41]
    count的值:40
    count的值:41
    count的值:42
    i的值:0
    集合所剩元素:[2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41]
    count的值:43
    count的值:44
    count的值:45
    i的值:2
    集合所剩元素:[2, 4, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41]
    count的值:46
    count的值:47
    count的值:48
    i的值:4
    集合所剩元素:[2, 4, 7, 8, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41]
    count的值:49
    count的值:50
    count的值:51
    i的值:6
    集合所剩元素:[2, 4, 7, 8, 11, 13, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41]
    count的值:52
    count的值:53
    count的值:54
    i的值:8
    集合所剩元素:[2, 4, 7, 8, 11, 13, 16, 17, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41]
    count的值:55
    count的值:56
    count的值:57
    i的值:10
    集合所剩元素:[2, 4, 7, 8, 11, 13, 16, 17, 20, 22, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41]
    count的值:58
    count的值:59
    count的值:60
    i的值:12
    集合所剩元素:[2, 4, 7, 8, 11, 13, 16, 17, 20, 22, 25, 26, 29, 31, 32, 34, 35, 37, 38, 40, 41]
    count的值:61
    count的值:62
    count的值:63
    i的值:14
    集合所剩元素:[2, 4, 7, 8, 11, 13, 16, 17, 20, 22, 25, 26, 29, 31, 34, 35, 37, 38, 40, 41]
    count的值:64
    count的值:65
    count的值:66
    i的值:16
    集合所剩元素:[2, 4, 7, 8, 11, 13, 16, 17, 20, 22, 25, 26, 29, 31, 34, 35, 38, 40, 41]
    count的值:67
    count的值:68
    count的值:69
    i的值:18
    集合所剩元素:[2, 4, 7, 8, 11, 13, 16, 17, 20, 22, 25, 26, 29, 31, 34, 35, 38, 40]
    count的值:70
    count的值:71
    count的值:72
    i的值:2
    集合所剩元素:[2, 4, 8, 11, 13, 16, 17, 20, 22, 25, 26, 29, 31, 34, 35, 38, 40]
    count的值:73
    count的值:74
    count的值:75
    i的值:4
    集合所剩元素:[2, 4, 8, 11, 16, 17, 20, 22, 25, 26, 29, 31, 34, 35, 38, 40]
    count的值:76
    count的值:77
    count的值:78
    i的值:6
    集合所剩元素:[2, 4, 8, 11, 16, 17, 22, 25, 26, 29, 31, 34, 35, 38, 40]
    count的值:79
    count的值:80
    count的值:81
    i的值:8
    集合所剩元素:[2, 4, 8, 11, 16, 17, 22, 25, 29, 31, 34, 35, 38, 40]
    count的值:82
    count的值:83
    count的值:84
    i的值:10
    集合所剩元素:[2, 4, 8, 11, 16, 17, 22, 25, 29, 31, 35, 38, 40]
    count的值:85
    count的值:86
    count的值:87
    i的值:12
    集合所剩元素:[2, 4, 8, 11, 16, 17, 22, 25, 29, 31, 35, 38]
    count的值:88
    count的值:89
    count的值:90
    i的值:2
    集合所剩元素:[2, 4, 11, 16, 17, 22, 25, 29, 31, 35, 38]
    count的值:91
    count的值:92
    count的值:93
    i的值:4
    集合所剩元素:[2, 4, 11, 16, 22, 25, 29, 31, 35, 38]
    count的值:94
    count的值:95
    count的值:96
    i的值:6
    集合所剩元素:[2, 4, 11, 16, 22, 25, 31, 35, 38]
    count的值:97
    count的值:98
    count的值:99
    i的值:8
    集合所剩元素:[2, 4, 11, 16, 22, 25, 31, 35]
    count的值:100
    count的值:101
    count的值:102
    i的值:2
    集合所剩元素:[2, 4, 16, 22, 25, 31, 35]
    count的值:103
    count的值:104
    count的值:105
    i的值:4
    集合所剩元素:[2, 4, 16, 22, 31, 35]
    count的值:106
    count的值:107
    count的值:108
    i的值:0
    集合所剩元素:[4, 16, 22, 31, 35]
    count的值:109
    count的值:110
    count的值:111
    i的值:2
    集合所剩元素:[4, 16, 31, 35]
    count的值:112
    count的值:113
    count的值:114
    i的值:0
    集合所剩元素:[16, 31, 35]
    count的值:115
    count的值:116
    count的值:117
    i的值:2
    集合所剩元素:[16, 31]
    count的值:118
    count的值:119
    count的值:120
    i的值:0
    集合所剩元素:[31]
    count的值:121
    最幸运的数字:31
    
    Process finished with exit code 0
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204

    ​ 可以看到最后集合当中只剩下16和31两个元素,如果约瑟夫的朋友是个顽固派,那么约瑟夫就不得不把朋友给干掉。最终活下来的依旧是聪明的约瑟夫。看完之后,不得不感慨犹太人是真有意思啊。想必这便是赌命的最高境界,不过约瑟夫是老千!也告诉我们一个道理,不要赌博!好了,这就是本期博文。如果你有更好的方法欢迎来到我的评论区交流。

  • 相关阅读:
    C++模板编程(11)---更深入的基础技术:模板引数(Template Argument)
    ensp实操浮动静态路由
    阿里二面:有一个 List 对象集合,如何优雅地返回给前端?
    MySQL建表操作和用户权限
    GoLong的学习之路(二十一)进阶,语法之并发(go最重要的特点)(协程的主要用法)
    【Linux】进程概念(万字详解)—— 冯诺依曼体系结构 | 操作系统 | 进程
    【web渗透】SSRF漏洞超详细讲解
    go 1.22 增强 http.ServerMux 路由能力
    2023最新SSM计算机毕业设计选题大全(附源码+LW)之java慢性病个人管理系统466cs
    倍市得CEM-ISV合作共创:体验加持,共建数字化产品护城河
  • 原文地址:https://blog.csdn.net/weixin_55418082/article/details/126179394