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. Linux配置JDK、Tomcat和Mysql免安装版

    现在已有JDK.Tomcat和mysql的tar.gz压缩文件 1.解压文件 (1)解压tar.gz tar -zxvf 待解压文件名 -C 解压到目标文件目录 (2)解压zip unzip 待解压文 ...

  2. Django知识总结(一)

    壹 ● 有关http协议 一 ● 全称 超文本传输协议(HyperText Transfer Protocol) 二 ● 协议 双方遵循的规范 http协议是属于应用层的协议(还有ftp, smtp等 ...

  3. 命令行运行Android Robotium自动化用例或单元测试用例

    本文目录 1.运行所有的测试用例 2.运行单个测试类或某个TestSuite 3.运行某个测试类里面的某个测试方法 4.运行两个不同的测试类或类中的方法 命令行运行Android Robotium自动 ...

  4. Altium 添加altera 或xilinx 芯片库的方法

    从altera或xilinx官网下载库,在library添加即可

  5. spring的bean创建过程

    Spring的bean创建过程 步骤 执行过程 描述 1 ThreadLocal.set bean创建之前将beanName的一些属性放进ThreadLocal,避免多线程创建bean导致问题,并发创 ...

  6. erlang并发编程

    1.erlang中创建进程(非操作系统线程,比其要轻量很多)非常方便,运用spawn函数即可 spawn(Fun) -> pid() spawn(Node, Fun) -> pid() s ...

  7. 正则表达式判断QQ号格式是否正确

    #正在表达式匹配QQ号格式是否正确#QQ号假如长度为5-11位,纯为数字 import rewhile 1: qq=input("请输入QQ号:") result=re.finda ...

  8. Java面试2018常考题目汇总

    一.JAVA基础篇-概念 1.简述你所知道的Linux: Linux起源于1991年,1995年流行起来的免费操作系统,目前, Linux是主流的服务器操作系统, 广泛应用于互联网.云计算.智能手机( ...

  9. jquery.validate.js使用实例

    一.常用方式: $('form').validate({  rules: {},        messages: { },        submitHandler: function () {}) ...

  10. GridView(多选功能)

    多选功能  将optionSelection下的MultiSelect修改为true开启多选,MultiSelectMode有三种模式可选,单元格选择,行选择,与checkBox选择,第三种选择方式会 ...