约瑟夫斯问题-java版数组解法和链表解法
10个人围成一圈,从1到10编号,从1开始数,数到3或3的倍数的位置,则该位置的人出局,求最后剩下哪一个号?
数组解法:
数组存放数组:a[10]存在1到10编号人
数组遍历到尾部又从头遍历:遍历数组--->内循环。设置一个外循环--->使得数组可以从头遍历,而且从1开始的的递增数字。while循环实现
数到3或3的倍数的位置出局:a[i]=0;
退出外部循环的条件:只剩下一人。
具体代码如下:
package algorithm.约瑟夫斯; public class 数组解法 { public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] a=new int[10];
for(int i=0;i<10;i++){
a[i]=i+1;
}
System.out.println("运行到这里");
int globalNum=0;
int count=a.length;
while(count>1){//退出外循环的条件
for(int i=0;i<a.length;i++){ while(a[i]==0){//跳过已出局的人,globalNum不统计
i++;
}
globalNum++;
if(globalNum%3==0){
a[i]=0;
count--;
}
}
}
System.out.println();
for(int i=0;i<a.length;i++){
if(a[i]!=0)
System.out.print(a[i]);
}
} }
单向链表解法(不删除元素):
package algorithm.约瑟夫斯; public class 链表解法 { public class Node{
public int index;
public Node next; public Node(){}
public Node(int index){
this.index=index;
next=null;
} } public static void main(String[] args) {
链表解法 r=new 链表解法();
链表解法.Node n=r.new Node();
链表解法.Node head=r.new Node();//链表头节点
链表解法.Node now=head;
int len=;//初始化的时候记录链表长度
//初始化链表
for(int i=;i<=;i++){
链表解法.Node node=r.new Node(i);
//Node是r的成员属性,当new Node(1),又new Node(1)时,
//如果合法,则调用new Node(1)时不知道调用哪个 now.next=node;
System.out.print(now.index+"、");
now=now.next;
if(i==)
System.out.println(now.index);
len++;
} 链表解法.Node present=head;
while(present.next!=null){
System.out.print(present.index+"、");
present=present.next;
if(present.next==null){
present.next=head;
System.out.println(present.index);
System.out.println("构建循环链表成功!"+present.index+"的下一个节点值:"+present.next.index);
break;
}
}
链表解法.Node present1=head;
int count1=len;
System.out.println("再次打印链表:");
while(present1.next!=null&&count1>=){
System.out.print(present1.index+"、");
present1=present1.next;
if(present1.index==){
System.out.println(present1.index);
}
count1--;
}
//约瑟夫斯问题求解
链表解法.Node p=head;
int count=len;
int global3=;
while(true){
while(p.index!=){
global3++;
System.out.print("["+global3+"、"+p.index+"]");
if(global3%==){
System.out.println("global= "+global3+"删除 "+p.index);
p.index=;
count--;
}
if(count<){
break;
}
p=p.next;
}
p=p.next;
if(count<){
break;
}
} 链表解法.Node present2=head;
int count2=len; while(present2.next!=null&&count2>){
System.out.print(present2.index+"、");
present2=present2.next;
count2--;
}
} }
约瑟夫斯问题-java版数组解法和链表解法的更多相关文章
- [Java]字符串数组 与 字符串链表 之间的相互转化
代码: package com.hy; import java.util.Arrays; import java.util.Collections; import java.util.List; pu ...
- 剑指Offer面试题16(Java版):反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点. 解决与链表相关的问题总是有大量的指针操作.而指针操作的代码总是easy出错的. 非常多的面试官喜欢出链表相关的问题,就是 ...
- 算法笔记_029:约瑟夫斯问题(Java)
目录 1 问题描述 2 解决方案 1 问题描述 引用自<算法设计与分析基础>第三版: 约瑟夫斯问题,是以弗拉瓦斯.约瑟夫斯(Flavius Josephus)的名字命名的.约瑟夫斯是一 ...
- Java实现约瑟夫斯问题
1 问题描述 引用自<算法设计与分析基础>第三版: 约瑟夫斯问题,是以弗拉瓦斯.约瑟夫斯(Flavius Josephus)的名字命名的.约瑟夫斯是一个著名的犹太历史学家,参加并记录了公元 ...
- java版数据结构与算法第二章数组
数组由一组具有相同类型的数据元素组成,并存储在一组连续存储单元中.一维数组是常量. 二维数组:若一维数组中的数据元素又是一堆数据结构,我们称之为二维数组.二维数组可以看成是n个列向量组成的线性表. 数 ...
- 《算法导论》第二章demo代码实现(Java版)
<算法导论>第二章demo代码实现(Java版) 前言 表示晚上心里有些不宁静,所以就写一篇博客,来缓缓.囧 拜读<算法导论>这样的神作,当然要做一些练习啦.除了练习题与思考题 ...
- 微博地址url(id)与mid的相互转换 Java版
原理: 新浪微博的URL都是如:http://weibo.com/2480531040/z8ElgBLeQ这样三部分. 第一部分(绿色部分)为新浪微博的域名,第二部分(红色部分)为博主Uid,第三部分 ...
- 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息
第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...
- 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...
随机推荐
- maven配置及使用
配置maven工程.从官网下载maven工具,然后解压到磁盘某个目录下即可. 计算机->属性->高级系统设置->环境变量. 新建如下变量: 变量名:MAVEN_HOME 变量值:C: ...
- java按照指定格式输出系统时间使用SimpleDateFormat方法
public class TimeThree { public static void main(String[] args) { SimpleDateFormat d = new SimpleDat ...
- FORTH 虚拟机内部结构
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- git 的安装与初始化
1搭建本地git服务器: 1.1安装git 对于ubuntu系统,一般自带git,可以使用git --version 查看版本号 ,或使用apt-get install git . centos上对 ...
- cocoapods 换源
1. 用以下步骤换源: pod repo remove master pod repo add master https://code.aliyun.com/Magi/CocoaPods.git po ...
- js 两数的最大公约数
function gcd(a,b){ if (b == 0){ return a; } var r = parseInt(a % b) ; return gcd(b, r);}gcd(12,5);
- 关于解决Mac使用docker安装SQL server for Linux 中文乱码问题
本人是Mac的追随者,无奈本学期数据库课要求使用Microsoft的SQL server.但是Microsoft并没有发布SQL server for Mac ,笔者使用Google搜索后, 发现可以 ...
- php留言板程序
=================== 先创建note.php <html><head><title>PHP留言本</title></head&g ...
- C++算法之大数加法计算的代码
如下代码段是关于C++算法之大数加法计算的代码,希望对大家有用. { int length; int index; int smaller; int prefix = 0; if(NULL == sr ...
- php上传文件配置
根据需要调整php.ini文件内容,完成后重启服务器即可. 上传文件相关配置内容: file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开 upload_tmp_d ...