约瑟夫斯问题-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 ...
 
随机推荐
- css 三角
			
http://peunzhang.github.io/demo/css_angle/index.html
 - Nodejs搭建基于express的应用,使用脚手架工具--express-generator
			
1.安装nodejs 1> 去nodejs官网下载最新nodejs安装包,地址:http://nodejs.cn/download/,选择自己适合自己电脑系统的安装包,下载下来,然后一直next ...
 - Promise 错误处理
			
Promise 是一个异步返回单个结果的函数或方法 不使用 `catch()` 时,在 `success handler` 里的错误无法被捕捉到 使用 `catch()` 时,在 `succe ...
 - Windows 2008 安装Sql server 2005
			
Windows 2008 安装Sql server 2005 进入下载的文件中,双击打开:splash.hta 文件进行安装 根据自己的系统来选择性进行安装,这里我们选择第二项:基于 x64 的操作系 ...
 - python学习------模块
			
模块(modue)的概念 在计算机程序开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件 ...
 - IDEA解决SVN更新冲突
			
在有冲突的文件上右键-> subversion ->resolve Text Confict->merge 将代码合并.
 - HDFS(一) 高级特性
			
三个高级特性——快照.配额.回收站 一.快照(snapshot):是一种备份,默认关闭 1.应用场景: 防止用户错误操作 备份 试验/测试 灾难恢复 2.命令: 管理命令: -allowsnapsho ...
 - Android : Camera2/HAL3 框架分析
			
一.Android O上的Treble机制: 在 Android O 中,系统启动时,会启动一个 CameraProvider 服务,它是从 cameraserver 进程中分离出来,作为一个独立进程 ...
 - MarkdownPan2 简单使用指南
			
markdown 简单使用指南 一级标题 二级标题 三级标题加代码 四级标题 这里是加粗 这里是正文and English 888 这里有正文嵌入代码这种样式 这里是代码块 这种使用的代码块 还有引用 ...
 - C# 索引和长度必须引用该字符串内的位置 LENGTH
			
今天遇到了 索引和长度必须引用该字符串内的位置 的问题. 原因是实用 Substring 对字符串进行了前五位的截取,但是忽略了字符串本身不足五位的情况. 如果不足五位,直接将整个字符串赋值过来,添加 ...