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版数组解法和链表解法的更多相关文章

  1. [Java]字符串数组 与 字符串链表 之间的相互转化

    代码: package com.hy; import java.util.Arrays; import java.util.Collections; import java.util.List; pu ...

  2. 剑指Offer面试题16(Java版):反转链表

    题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点. 解决与链表相关的问题总是有大量的指针操作.而指针操作的代码总是easy出错的. 非常多的面试官喜欢出链表相关的问题,就是 ...

  3. 算法笔记_029:约瑟夫斯问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 引用自<算法设计与分析基础>第三版: 约瑟夫斯问题,是以弗拉瓦斯.约瑟夫斯(Flavius Josephus)的名字命名的.约瑟夫斯是一 ...

  4. Java实现约瑟夫斯问题

    1 问题描述 引用自<算法设计与分析基础>第三版: 约瑟夫斯问题,是以弗拉瓦斯.约瑟夫斯(Flavius Josephus)的名字命名的.约瑟夫斯是一个著名的犹太历史学家,参加并记录了公元 ...

  5. java版数据结构与算法第二章数组

    数组由一组具有相同类型的数据元素组成,并存储在一组连续存储单元中.一维数组是常量. 二维数组:若一维数组中的数据元素又是一堆数据结构,我们称之为二维数组.二维数组可以看成是n个列向量组成的线性表. 数 ...

  6. 《算法导论》第二章demo代码实现(Java版)

    <算法导论>第二章demo代码实现(Java版) 前言 表示晚上心里有些不宁静,所以就写一篇博客,来缓缓.囧 拜读<算法导论>这样的神作,当然要做一些练习啦.除了练习题与思考题 ...

  7. 微博地址url(id)与mid的相互转换 Java版

    原理: 新浪微博的URL都是如:http://weibo.com/2480531040/z8ElgBLeQ这样三部分. 第一部分(绿色部分)为新浪微博的域名,第二部分(红色部分)为博主Uid,第三部分 ...

  8. 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息

    第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...

  9. 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...

随机推荐

  1. JAVA的入门代码

    public class HelloWord{ public static void main(String[] args){ System.out.println("你好,java&quo ...

  2. spring(AOP)静态代理

    姓名:黄于霞      班级:软件151 1.定义抽象主题接口,假设需实现一个计算的类Math.完成加.减.乘.除功能,如下所示: 2.主题类,算术类,实现抽象接口. 3.代理类 4.测试运行 5.总 ...

  3. K2百家讲坛 | 越秀地产:K2为房企数字化转型带来更多可能

    随着数字化经济时代的到来,房地产行业逐渐形成了新的竞争和市场格局,房企要在此背景下实现稳步发展,需要由原本的粗放式管理逐渐向集团性管理.精细化管控转变,这对房企的经营发展战略和业务管理方式都提出了不小 ...

  4. JDBC连接ORACLE的三种URL格式

    格式一: Oracle JDBC Thin using an SID jdbc:oracle:thin:@host:port:SID 例如: jdbc:oracle:thin:@localhost:1 ...

  5. js初学

    1.学习一门编程语言需要记住知识点:          1.关键字.     2.标识符.     3.注释.     4.运算符.     5.常量和变量 .     6.语句.     7.函数 ...

  6. ALV屏幕捕捉回车及下拉框事件&ALV弹出框回车及下拉框事件

    示例展示: 屏幕依据输入的物料编码或下拉框物料编码拍回车自动带出物料描述: 点击弹出框,输入物料编码拍回车带出物料描述,点击确认,更新ALV: 1.创建屏幕9000,用于处理ALV弹出框: 2.针对屏 ...

  7. vue项目使用前端框架开发,实现滑动效果,若不刷新页面则无法达到预期效果的问题及解决方法

    滑动等效果的初始化时机很重要,在vue项目开发中,需到mounted()钩子函数 (当组件中的DOM结构被渲染好并放到页面中后,会执行这个钩子函数,此时即可初始化滑动效果的js代码). 若组件未挂载到 ...

  8. java上传图片

    -- jsp 一定要加上enctype="multipart/form-data" method="post"  不加无法辨别是否是上传表单的数据 <fo ...

  9. 精进之路之AQS及相关组件

    AQS ( AbstractQueuedSynchronizer)是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Sem ...

  10. JavsScript学习---快速排序

    <script type="text/javascript"> /** * “快速排序”的思想很简单,整个排序过程只需要三步: * (1)在数据集之中,找一个基准点 * ...