zoukankan      html  css  js  c++  java
  • 约瑟夫斯问题-java版数组解法和链表解法

    10个人围成一圈,从1到10编号,从1开始数,数到3或3的倍数的位置,则该位置的人出局,求最后剩下哪一个号?

    数组解法:

    数组存放数组:a[10]存在1到10编号人

    数组遍历到尾部又从头遍历:遍历数组--->内循环。设置一个外循环--->使得数组可以从头遍历,而且从1开始的的递增数字。while循环实现

    数到3或3的倍数的位置出局:a[i]=0;

    退出外部循环的条件:只剩下一人。

    具体代码如下:

     1 package algorithm.约瑟夫斯;
     2 
     3 public class 数组解法 {
     4 
     5     
     6     public static void main(String[] args) {
     7         // TODO 自动生成的方法存根
     8         int[] a=new int[10];
     9         for(int i=0;i<10;i++){
    10             a[i]=i+1;
    11         }
    12         System.out.println("运行到这里");
    13         int globalNum=0;
    14         int count=a.length;
    15         while(count>1){//退出外循环的条件
    16             for(int i=0;i<a.length;i++){
    17                 
    18                 while(a[i]==0){//跳过已出局的人,globalNum不统计
    19                     i++;
    20                 }
    21                 globalNum++;
    22                 if(globalNum%3==0){
    23                     a[i]=0;
    24                     count--;
    25                 }
    26             }
    27         }
    28         System.out.println();
    29         for(int i=0;i<a.length;i++){
    30             if(a[i]!=0)
    31                 System.out.print(a[i]);
    32         }
    33     }
    34 
    35 }
    View Code

     单向链表解法(不删除元素):

     1 package algorithm.约瑟夫斯;
     2 
     3 public class 链表解法 {
     4     
     5     public class Node{
     6         public int index;
     7         public Node next;
     8         
     9         public Node(){}
    10         public Node(int index){
    11             this.index=index;
    12             next=null;
    13         }
    14         
    15     }
    16     
    17     public static void main(String[] args) {
    18         链表解法 r=new 链表解法();
    19         链表解法.Node n=r.new Node();
    20         链表解法.Node head=r.new Node(1);//链表头节点
    21         链表解法.Node now=head;
    22         int len=0;//初始化的时候记录链表长度
    23         //初始化链表
    24         for(int i=2;i<=10;i++){
    25             链表解法.Node node=r.new Node(i);
    26             //Node是r的成员属性,当new Node(1),又new Node(1)时,
    27                                   //如果合法,则调用new Node(1)时不知道调用哪个
    28             
    29             now.next=node;
    30             System.out.print(now.index+"");
    31             now=now.next;
    32             if(i==10)
    33                 System.out.println(now.index);
    34             len++;
    35         }
    36         
    37         链表解法.Node present=head;
    38         while(present.next!=null){
    39             System.out.print(present.index+"");
    40             present=present.next;
    41             if(present.next==null){
    42                 present.next=head;
    43                 System.out.println(present.index);
    44                 System.out.println("构建循环链表成功!"+present.index+"的下一个节点值:"+present.next.index);
    45                 break;
    46             }
    47         }
    48         链表解法.Node present1=head;
    49         int count1=len;
    50         System.out.println("再次打印链表:");
    51         while(present1.next!=null&&count1>=1){
    52             System.out.print(present1.index+"");
    53             present1=present1.next;
    54             if(present1.index==10){
    55                 System.out.println(present1.index);
    56             }
    57             count1--;
    58         }
    59         //约瑟夫斯问题求解
    60         链表解法.Node p=head;
    61         int count=len;
    62         int global3=0;
    63         while(true){
    64             while(p.index!=0){
    65                 global3++;
    66                 System.out.print("["+global3+""+p.index+"]");
    67                 if(global3%3==0){
    68                    System.out.println("global= "+global3+"删除 "+p.index);
    69                    p.index=0;
    70                    count--;
    71                 }
    72                 if(count<2){
    73                     break;
    74                 }
    75                 p=p.next;
    76             }
    77             p=p.next;
    78             if(count<2){
    79                 break;
    80             }
    81         }
    82         
    83         链表解法.Node present2=head;
    84         int count2=len;
    85         
    86         while(present2.next!=null&&count2>1){
    87             System.out.print(present2.index+"");
    88             present2=present2.next;
    89             count2--;
    90         }
    91     }
    92 
    93 }
    View Code
  • 相关阅读:
    .NET Interop 工具集
    关于正弦波的算法
    Windows Phone 系列 本地数据存储
    Xaml cannot create an instance of “X”
    Windows Phone 系列 使用 MVVM绑定时无法获取当前值
    Windows Phone 系列 应用程序图标无法显示
    Windows Phone 系列 WPConnect无法上网的问题
    Windows Phone 系列 使用 Windows Phone 保存铃声任务
    WP7.5提交应用
    Windows Phone 系列 动态删除ObservableCollection
  • 原文地址:https://www.cnblogs.com/dengrong/p/8520291.html
Copyright © 2011-2022 走看看