java数据结构题之约瑟夫问题

简介:

约瑟夫问题:转载自    约瑟夫问题

据说着名犹太历史/数学家约瑟夫(Josephus)有过以下的故事:在罗马人占领乔塔帕特後,40个犹太士兵与约瑟夫躲到一个洞中,眼见脱逃无望,一群人决定集体自杀,约瑟夫建议自杀方式,41个人排成圆圈,由第1个人开始报数,每报数到5的人就必须自杀,然後由下一个重新报数,直到所有人都自杀身亡为止。如果你是约瑟夫,你应该在哪个位置才能活下来(最后只剩下你)?


我的答案:

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
package  p1;
 
import  java.util.LinkedList;
import  java.util.List;
 
public  class  KillSelf {
     //构造链式列表,用来模拟人。
     private  static  List<String> list =  new  LinkedList<String>();
     //记忆自杀那个人前后的人集合有序子列表
     private  static  List<String> listBefore,listAfter;
     //自杀那个人的编号从1开始
     private  static  String killedNum =  null ;
     private  static   int  KILL_INDEX =  4 ;
     //记录自杀的总人数
     private  static  int  sum =  0 ;
     public  static  void  main(String[] args) {
         
         //记住每个从最开始的编号
         for ( int  i =  1 ;i <=  41 ;i++)
         {
             list.add(i+ "" );
         }
         //其实自杀的过程,是一个循环的过程,所以用循环来解决。
         while ( true )
         {
             //获取自杀位置前后的子集
             if (list.size()>= 5 )    //当人数大于等于5个人时
             {
                 listBefore =  new  LinkedList<String>(list.subList( 0 , KILL_INDEX));  //不能直接用subList的返回值,要包装一下
                 listAfter =  new  LinkedList<String>(list.subList(KILL_INDEX+ 1 , list.size()));
             } else  if (list.size() >  1  && list.size() <  5 )        //当人数多于1个人但是少于5个人时
             {
                 KILL_INDEX =  5 %list.size()- 1 //这个判断很巧妙
                 if (KILL_INDEX >  0  && KILL_INDEX <list.size()- 1 )
                 {
                     listBefore =  new  LinkedList<String>(list.subList( 0 , KILL_INDEX));  //不能直接用subList的返回值,要包装一下
                     listAfter =  new  LinkedList<String>(list.subList(KILL_INDEX+ 1 , list.size()));
                 } else  if (KILL_INDEX ==  0 )
                 {
                     listBefore.clear();
                     listAfter =  new  LinkedList<String>(list.subList(KILL_INDEX+ 1 , list.size()));
                 } else  if (KILL_INDEX == list.size()- 1 )
                 {
                     listBefore =  new  LinkedList<String>(list.subList( 0 , KILL_INDEX));
                     listAfter.clear();
                 }
                 
             } else
                 break ;
             //将子集的后与前连接起来,更新总的集合
             killedNum = list.get(KILL_INDEX);
             sum++;
             System.out.println( "编号"  + killedNum +  "已自杀!-----自杀总人数达"  + sum);
             //更新list
             list.clear();
             list.addAll(listAfter);
             list.addAll(listBefore);
             System.out.println( "剩余人员编号:" +list);
             System.out.println( "" );
         }
         System.out.println( "" );
         System.out.println( "结论:处在" +list.get( 0 )+ "号才不会自杀" );
     }
}

但是网上的帖子,几行代码就解决问题了,这就是算法的魅力!




      本文转自屠夫章哥  51CTO博客,原文链接:http://blog.51cto.com/4259297/1658382,如需转载请自行联系原作者



相关文章
|
1月前
|
算法 索引
【数据结构与算法】5、循环链表、约瑟夫问题、静态链表
【数据结构与算法】5、循环链表、约瑟夫问题、静态链表
36 0
|
27天前
|
存储 算法 Java
Java数据结构与算法-java数据结构与算法(二)
Java数据结构与算法-java数据结构与算法
73 1
|
1月前
|
缓存 算法 安全
Java集合框架:深入探究数据结构与算法的精华
Java集合框架:深入探究数据结构与算法的精华
|
4天前
|
存储 供应链 Java
《Java 简易速速上手小册》第3章:Java 数据结构(2024 最新版)
《Java 简易速速上手小册》第3章:Java 数据结构(2024 最新版)
4 1
|
11天前
|
Java API
编码的奇迹:Java 21引入有序集合,数据结构再进化
编码的奇迹:Java 21引入有序集合,数据结构再进化
16 0
|
27天前
|
XML 存储 算法
Java数据结构与算法-java数据结构与算法(五)
Java数据结构与算法-java数据结构与算法
47 0
|
29天前
|
缓存 安全 Java
Java并发编程中的高效数据结构 - ConcurrentHashMap
本文将深入探讨Java并发编程中的一种高效数据结构 - ConcurrentHashMap。我们将详细介绍ConcurrentHashMap的基本原理,包括其设计思路、实现方式以及如何在多线程环境下提供高效的并发访问。同时,我们还将通过实例代码演示如何使用ConcurrentHashMap来优化并发程序的性能。
|
30天前
|
Java 数据库连接 API
Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
Java 是一种广泛使用的、面向对象的编程语言,始于1995年,以其跨平台性、安全性和可靠性著称,应用于从移动设备到数据中心的各种场景。基础概念包括变量(如局部、实例和静态变量)、数据类型(原始和非原始)、条件语句(if、else、switch等)、函数、循环、异常处理、数据结构(如数组、链表)和面向对象编程(类、接口、继承等)。深入学习还包括包、内存管理、集合框架、序列化、网络套接字、泛型、流、JVM、垃圾回收和线程。构建工具如Gradle、Maven和Ant简化了开发流程,Web框架如Spring和Spring Boot支持Web应用开发。ORM工具如JPA、Hibernate处理对象与数
92 3
|
1月前
|
Java
Java的常量数据结构
Java的常量数据结构
10 0
|
1月前
|
存储 算法 C语言
【数据结构与算法】【约瑟夫问题】还在用递归?教你用链表秒杀约瑟夫
【数据结构与算法】【约瑟夫问题】还在用递归?教你用链表秒杀约瑟夫