约瑟夫斯问题-java版数组解法和链表解法

10个人围成一圈,从1到10编号,从1开始数,数到3或3的倍数的位置,则该位置的人出局,求最后剩下哪一个号?

 

数组解法:

数组存放数组:a[10]存在1到10编号人

数组遍历到尾部又从头遍历:遍历数组--->内循环。设置一个外循环--->使得数组可以从头遍历,而且从1开始的的递增数字。while循环实现

数到3或3的倍数的位置出局:a[i]=0;

退出外部循环的条件:只剩下一人。

具体代码如下:

 1 package algorithm.约瑟夫斯;
 2 
 3 public class 数组解法 {
 4 
 5     
 6     public static void main(String[] args) {
 7         // TODO 自动生成的方法存根
 8         int[] a=new int[10];
 9         for(int i=0;i<10;i++){
10             a[i]=i+1;
11         }
12         System.out.println("运行到这里");
13         int globalNum=0;
14         int count=a.length;
15         while(count>1){//退出外循环的条件
16             for(int i=0;i<a.length;i++){
17                 
18                 while(a[i]==0){//跳过已出局的人,globalNum不统计
19                     i++;
20                 }
21                 globalNum++;
22                 if(globalNum%3==0){
23                     a[i]=0;
24                     count--;
25                 }
26             }
27         }
28         System.out.println();
29         for(int i=0;i<a.length;i++){
30             if(a[i]!=0)
31                 System.out.print(a[i]);
32         }
33     }
34 
35 }
View Code

 单向链表解法(不删除元素):

 1 package algorithm.约瑟夫斯;
 2 
 3 public class 链表解法 {
 4     
 5     public class Node{
 6         public int index;
 7         public Node next;
 8         
 9         public Node(){}
10         public Node(int index){
11             this.index=index;
12             next=null;
13         }
14         
15     }
16     
17     public static void main(String[] args) {
18         链表解法 r=new 链表解法();
19         链表解法.Node n=r.new Node();
20         链表解法.Node head=r.new Node(1);//链表头节点
21         链表解法.Node now=head;
22         int len=0;//初始化的时候记录链表长度
23         //初始化链表
24         for(int i=2;i<=10;i++){
25             链表解法.Node node=r.new Node(i);
26             //Node是r的成员属性,当new Node(1),又new Node(1)时,
27                                   //如果合法,则调用new Node(1)时不知道调用哪个
28             
29             now.next=node;
30             System.out.print(now.index+"");
31             now=now.next;
32             if(i==10)
33                 System.out.println(now.index);
34             len++;
35         }
36         
37         链表解法.Node present=head;
38         while(present.next!=null){
39             System.out.print(present.index+"");
40             present=present.next;
41             if(present.next==null){
42                 present.next=head;
43                 System.out.println(present.index);
44                 System.out.println("构建循环链表成功!"+present.index+"的下一个节点值:"+present.next.index);
45                 break;
46             }
47         }
48         链表解法.Node present1=head;
49         int count1=len;
50         System.out.println("再次打印链表:");
51         while(present1.next!=null&&count1>=1){
52             System.out.print(present1.index+"");
53             present1=present1.next;
54             if(present1.index==10){
55                 System.out.println(present1.index);
56             }
57             count1--;
58         }
59         //约瑟夫斯问题求解
60         链表解法.Node p=head;
61         int count=len;
62         int global3=0;
63         while(true){
64             while(p.index!=0){
65                 global3++;
66                 System.out.print("["+global3+""+p.index+"]");
67                 if(global3%3==0){
68                    System.out.println("global= "+global3+"删除 "+p.index);
69                    p.index=0;
70                    count--;
71                 }
72                 if(count<2){
73                     break;
74                 }
75                 p=p.next;
76             }
77             p=p.next;
78             if(count<2){
79                 break;
80             }
81         }
82         
83         链表解法.Node present2=head;
84         int count2=len;
85         
86         while(present2.next!=null&&count2>1){
87             System.out.print(present2.index+"");
88             present2=present2.next;
89             count2--;
90         }
91     }
92 
93 }
View Code

 

转载于:https://www.cnblogs.com/dengrong/p/8520291.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

少写点if-else吧,它的效率有多低你知道吗?

# 干了这碗鸡汤我要再和生活死磕几年。要么我就毁灭&#xff0c;要么我就注定铸就辉煌。如果有一天&#xff0c;你发现我在平庸面前低了头&#xff0c;请向我开炮。--杰克凯鲁亚克if-else涉及到分支预测的概念&#xff0c;关于分支预测上篇文章《虚函数真的就那么慢吗&#xff…

为什么不能在中断上半部休眠?

这是一个老生常谈的问题。我们先简单说下什么是中断「因为最近在群里看到有人竟然不懂什么是中断」。中断是计算机里面非常核心的东西&#xff0c;我们可以跑OS&#xff0c;可以多任务运行都因为中断的存在。假设你是一个CPU&#xff0c;你正在睡觉。你突然觉得肚子疼&#xff…

j.u.c系列(08)---之并发工具类:CountDownLatch

写在前面 CountDownLatch所描述的是”在完成一组正在其他线程中执行的操作之前&#xff0c;它允许一个或多个线程一直等待“&#xff1a;用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法&#xff0c;所以在当前计数到达零之前&#xff0c;await 方法会一直受…

巧用1个GPIO控制2个LED显示4种状态

很多电子产品有状态指示灯&#xff0c;比如电视机&#xff1a;待机状态亮红灯开机状态亮绿灯实现起来很简单&#xff0c;微控制器MCU的两个GPIO分别控制就行&#xff1a;不过资源总是紧张的&#xff0c;有时候会碰到GPIO不够用的情况。如果只用1个GPIO&#xff0c;可不可以实现…

大大大大数怎么求余?C语言

问题&#xff1a;一个特别大的数除以23求余数用C语言应该怎么算啊&#xff1f;比如23232323232323232323232323232323232323232323232323232323233除以23&#xff0c;怎么算余数&#xff1f;数据类型在计算机的存储是有大小限制的&#xff0c;所以才出现了大数求余这种问题&…

程序员因拒绝带电脑回家工作被开除!获赔19.4万元

近日&#xff0c;男子拒绝春节带电脑回家工作被开除的消息&#xff0c;成为了不少网友关注的焦点&#xff0c;引发网友共鸣。因为春节拒绝带工作电脑回家被开除&#xff0c;上海一位软件工程师起诉公司获赔19.4万元。2月2日&#xff0c;据上海浦东法院公众号消息&#xff0c;该…

随便写写(5)

也许是今年发生的事情太多了&#xff0c;所以比以前要更关注时事&#xff0c;虽然面对一些既成的事实&#xff0c;难免要进行痛心的思考。 昨天晚上关注了一下东方卫视播出的9.8特大尾矿库溃坝事故的后续报道&#xff0c;这起特大人为事故已经得到了认定&#xff0c;相关的责任…

利用C语言中的setjmp和longjmp,来实现异常捕获和协程

一、前言二、函数语法介绍与 goto 语句比较与 fork 函数比较与 Python 语言中的 yield/resume 比较三、利用 setjmp/longjmp 实现异常捕获四、利用 setjmp/longjmp 实现协程五、总结一、前言 在 C 标准库中&#xff0c;有两个威力很猛的函数&#xff1a;setjmp 和 longjmp&…

centos6.9系列LNMP环境的安装

一、Nginx 1.先解决Nginx的依赖关系&#xff1a; yum install -y pcre-devel openssl-devel 2.安装wget&#xff1a;sudo yum -y install wget 3.下载nginx的安装包&#xff1a;wget http://nginx.org/download/nginx-1.10.3.tar.gz 4.解压nginx文件包&#xff1a;tar xf nginx…

Linux 修改 ELF 解决 glibc 兼容性问题

转自&#xff1a;Soul Of Free Loophttps://zohead.com/archives/mod-elf-glibc/Linux glibc 问题相信有不少 Linux 用户都碰到过运行第三方&#xff08;非系统自带软件源&#xff09;发布的程序时的 glibc 兼容性问题&#xff0c;这一般是由于当前 Linux 系统上的 GNU C 库&am…

VS2010创建ATL工程及使用C++测试COM组件

VS2010创建ATL工程及使用C测试COM组件 1.创建ATL项目&#xff0c;取名MyCom 2. ATL 项目向导&#xff0c;勾选 【支持COM 1.0】和【支持部件注册器】&#xff0c;其他默认&#xff0c;点击完成。 3.在该项目中添加类 4.添加一个ATL简单对象 5. ATL 简单对象向导&#xff0c…

芯片IC附近为啥要放0.1uF的电容?看完秒懂~

数字电路要运行稳定可靠&#xff0c;电源一定要”干净“&#xff0c;并且能量补充一定要及时&#xff0c;也就是滤波去耦一定要好。什么是滤波去耦&#xff0c;简单的说就是在芯片不需要电流的时候存储能量&#xff0c;在需要电流的时候又能及时地补充能量。有读者看到这里会说…

无线中继蹭网(转)

随着无线技术的逐渐成熟&#xff0c;无线设备的价格也越来越低&#xff0c;已经有不少的家庭开始在自己的家中建立无线网络&#xff0c;利用笔记本&#xff0c;具备WiFi功能的手机连接无线网络享受冲浪乐趣&#xff0c;很多时候为了节约网费可能几家人一起共用一个ADSL上网帐号…

深入掌握Linux操作系统,其实也没你想象那么难

曹政大家应该都不陌生吧&#xff0c;众多IT人的偶像&#xff0c;数据、技术、业务&#xff0c;无一不精&#xff0c;被大家称为曹大。在曹大的一篇文章中&#xff0c;他曾经提到过&#xff0c;1998年&#xff0c;自己的第一份工作接手的是一个Windows系统下的人才网站系统&…

WSS页面定制系列(1)--如何启用表单页面的编辑模式

wss的大多数页面右上角的“站点操作”菜单都有一个编辑网页菜单项&#xff0c;用这个菜单项&#xff0c;可以启用当前页面的设计模式&#xff0c;修改或添加webpart。但是奇怪的是&#xff0c;所有的表单页面&#xff08;用来新建&#xff0c;编辑&#xff0c;查看列表项的页面…

单片机检测220V交流电通断电路

我们在topemic网站上分享过一篇题为"单片机检测220V交流电通断电路"的文章&#xff0c;目前有近万次阅读&#xff0c;在这里做个总结分享给没有读过该文的公众号朋友。废话不多说&#xff0c;直接上图&#xff1a;该电路工作原理如下&#xff1a;当220V断开时&#x…

Qt值得学习吗?详解Qt的几种开发方式

qt值得学习吗&#xff1f;嵌入式要学的东西真的很多&#xff0c;我们可能会说不写界面的话就不用学qt了&#xff1f;我不赞同。Qt的实现主要是采用p-impl手法&#xff0c;实现接口与实现分离&#xff0c;它有很好的消息循环机制&#xff0c;有的对象与线程的相关性&#xff0c;…

技术QA:如何安装并启用BITS和WebDAV?

引子&#xff1a; 在安装SCCM 2007 SP1时&#xff0c;必须要安装并启用BITS和WebDAV&#xff0c;否则在SCCM 2007 SP1安装先决条件检查时将会报错。它们以前都是IIS的功能组件&#xff0c;但是在IIS 7中变动很大&#xff0c;特别是在 Windows Server 2008 操作系统中现在已经不…

C语言,谁都能看得懂的归并排序

喜欢看排序算法动态效果的&#xff0c;可以看看这个网站https://visualgo.net/zh/sorting里面很多算法的动画解释&#xff0c;可以看到算法的排序效果&#xff0c;而且还附带了伪代码的实现过程。本来想录制几张动图放上来&#xff0c;但是因为图片较大&#xff0c;传不上来&am…

内核链表list.h文件剖析

内核链表list.h文件剖析 一、内核链表的结构【双向循环链表】 内核链表的好主要体现为两点&#xff0c;1是可扩展性&#xff0c;2是封装。可以将内核链表复用到用户态编程中&#xff0c;以后在用户态下编程就不需要写一些关于链表的代码了&#xff0c;直接将内核中list.h中的代…