约瑟夫斯问题-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…

js实现连接的两种放法

第一种用document.write输出 <html> <body> <script type"text/javascript"> var rMath.random() if (r>0.5) { document.write("<a hrefhttp://www.w3school.com.cn>学习 Web 开发&#xff01;</a>") } else { documen…

异或求校验和

uint8_t chk_xrl(const void *data, uint16_t length) {const uint8_t *buf data;uint8_t retval 0;while(length){retval ^ *buf;--length;}return retval; }

c语言笔试

1、局部变量能否和全局变量重名&#xff1f;   答&#xff1a;能&#xff0c;局部会屏蔽全局。要用全局变量&#xff0c;需要使用"::" ;局部变量可以与全局变量同名&#xff0c;在函数内引用这个变量时&#xff0c;会用到同名的局部变量&#xff0c;而不会用到全局…

聚宝盆,只要你上网就可以挣钱

点此注册[url]http://www.56cash.com/ref.php?id5429[/url]转载于:https://blog.51cto.com/435178/100909

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

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

打CALL APP 项目进展 总体计划

时间进展完成度参与人员备注2018.3完成app的前端设计 全体 2018.4app的后端 2018.5app的后端 转载于:https://www.cnblogs.com/aliceluorong/p/8520442.html

单片机中通用的类型别名

单片机中通用的类型别名 #ifndef _TYPE_H_ #define _TYPE_H_#ifdef __GNUC__ #define __packed __attribute__((aligned(1))) #endif/* exact-width signed integer types */ typedef signed char int8_t; typedef signed short int int16_t; typedef sign…

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;可不可以实现…

GetTickcount函数

GetTickCount是一种函数。GetTickCount返回&#xff08;retrieve&#xff09;从操作系统启动所经过&#xff08;elapsed&#xff09;的毫秒数&#xff0c;它的返回值是DWORD。 GetTickcount函数&#xff1a;它返回从操作系统启动到当前所经过的毫秒数&#xff0c;常常用来判断某…

网络大小端转换函数

网络大小端转换函数 //***************************************************************************** // // htonl/ntohl - big endian/little endian byte swapping macros for // 32-bit (long) values // //**********************************************************…

5-全排列总结:

https://www.nowcoder.com/acm/contest/76/H 给一道题&#xff0c;可以去测试代码。 这里总结一下全排列的几种方法&#xff1a; 方法一&#xff1a;利用交换排列&#xff1a;缺点&#xff1a;不能按字典序排列&#xff0c;但可以借助set处理。 #include <bits/stdc.h> …

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

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

substr

substr &#xff08;C语言函数&#xff09; 编辑 substr是C语言函数&#xff0c;主要功能是复制子字符串&#xff0c;要求从指定位置开始&#xff0c;并具有指定的长度。如果没有指定长度_Count或_Count_Off超出了源字符串的长度&#xff0c;则子字符串将延续到源字符串的结尾…

***站长自述挂马经历 提醒挂马者回头是岸

我做站都已经接近三年了&#xff0c;期间像很多人一样买过很多玉米&#xff0c;但是因为养不起&#xff0c;至今只保留了一个域名&#xff08;159e.cn&#xff09; &#xff0c;当时学校正流行移动159的号码&#xff0c;然后e在网络上代表很多意思&#xff0c;就注册了这个域名…

微信公众号--相关资料

相关资料 l 官方文档&#xff1a;https://mp.weixin.qq.com/wiki?tresource/res_main&idmp1445241432 l 测试号&#xff1a;https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?actionshowinfo&tsandbox/index l 接口调试地址&#xff1a;https://mp.weixin.qq.…

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

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

键值键名

在注册表中 所谓的键&#xff0c;是指一个注册表条目。 键名&#xff0c;是这个条目的名称 键值是为这个条目所赋予的值。 比如&#xff1a; NoDesktop1 这就是一个键 NoDesktop是一个键名 1就是一个键值 这个条目的意思是说&#xff1a;NoDesktop是没有桌面当值为1的时候&…

随便写写(5)

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