约瑟夫斯问题-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 ...
随机推荐
- Linux配置JDK、Tomcat和Mysql免安装版
现在已有JDK.Tomcat和mysql的tar.gz压缩文件 1.解压文件 (1)解压tar.gz tar -zxvf 待解压文件名 -C 解压到目标文件目录 (2)解压zip unzip 待解压文 ...
- Django知识总结(一)
壹 ● 有关http协议 一 ● 全称 超文本传输协议(HyperText Transfer Protocol) 二 ● 协议 双方遵循的规范 http协议是属于应用层的协议(还有ftp, smtp等 ...
- 命令行运行Android Robotium自动化用例或单元测试用例
本文目录 1.运行所有的测试用例 2.运行单个测试类或某个TestSuite 3.运行某个测试类里面的某个测试方法 4.运行两个不同的测试类或类中的方法 命令行运行Android Robotium自动 ...
- Altium 添加altera 或xilinx 芯片库的方法
从altera或xilinx官网下载库,在library添加即可
- spring的bean创建过程
Spring的bean创建过程 步骤 执行过程 描述 1 ThreadLocal.set bean创建之前将beanName的一些属性放进ThreadLocal,避免多线程创建bean导致问题,并发创 ...
- erlang并发编程
1.erlang中创建进程(非操作系统线程,比其要轻量很多)非常方便,运用spawn函数即可 spawn(Fun) -> pid() spawn(Node, Fun) -> pid() s ...
- 正则表达式判断QQ号格式是否正确
#正在表达式匹配QQ号格式是否正确#QQ号假如长度为5-11位,纯为数字 import rewhile 1: qq=input("请输入QQ号:") result=re.finda ...
- Java面试2018常考题目汇总
一.JAVA基础篇-概念 1.简述你所知道的Linux: Linux起源于1991年,1995年流行起来的免费操作系统,目前, Linux是主流的服务器操作系统, 广泛应用于互联网.云计算.智能手机( ...
- jquery.validate.js使用实例
一.常用方式: $('form').validate({ rules: {}, messages: { }, submitHandler: function () {}) ...
- GridView(多选功能)
多选功能 将optionSelection下的MultiSelect修改为true开启多选,MultiSelectMode有三种模式可选,单元格选择,行选择,与checkBox选择,第三种选择方式会 ...