A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

约瑟夫环这个例子还是搞不懂啊

4 个回复

正序浏览
  1. package com.heima;

  2. import java.util.ArrayList;

  3. public class Test7 {
  4.         /*
  5.          * 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)
  6.          * 围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始
  7.          * 报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
  8.          */
  9.         public static void main(String[] args) {
  10.                 System.out.println(lastOne(1, 3, 8));
  11.         }

  12.         // start代表编号为K,开始数数;end代表m,数到m那个人出列;sum总共有n个人
  13.         public static int lastOne(int start, int end, int sum) {
  14.                 ArrayList<Integer> list = new ArrayList<>();
  15.                 //用集合模拟1,2,3,4..n个人围成一桌
  16.                 for (int i = 1; i <= sum; i++) {
  17.                         list.add(i);
  18.                 }
  19.                 int count = 1;   //数数变量,记录当前已数到哪个数
  20.                 //start-1是因为集合索引从0开始,只要集合不只剩一个人就一直数数剔除人
  21.                 //i记录count数数变量所指的集合位置,也就是数到的人
  22.                 for (int i = start - 1; list.size() != 1; i++) {
  23.                         //数到圆圈中最后一个人,从剩下的第一人也就是集合索引为0的人继续
  24.                         if (i == list.size())
  25.                                 i = 0;
  26.                         /*每数到第end个人数就剔除,i--是因为ArrayList集合底层数组实现,
  27.                         每删除一个元素,后面的元素都会往前移一位,这样不会漏数i后面的第一个元素*/
  28.                         if (count % end == 0)
  29.                                 list.remove(i--);
  30.                         count++; //往后数一个数
  31.                 }
  32.                 return list.get(0);//获取最后剩下一人的编号
  33.         }
  34. }
复制代码
回复 使用道具 举报
这个题目是什么
回复 使用道具 举报

public class Test4 {
        private static final int count=6;
        private static final int key=3;
        public static void main(String[] args) {
                int[]arr=new int[count];
                for (int i = 0; i < count; i++) {
                        arr[i]=i+1;
                }
                System.out.println(getPosition(arr, key));
        }

        public static int getPosition(int[]arr, int key){
                int index=0;
                int count=1;
               
                //检查是不是只剩一个元素不是0
                while(check(arr)){
                        //索引越过最后一位时重置为0
                        if(index>arr.length-1){
                                index=0;
                        }
                        //如果当前元素是0则跳过当前元素
                        while(arr[index]==0){
                                index++;
                                if(index>arr.length-1){
                                        index=0;
                                }
                        }
                        //如果是第key个元素就置为0
                        if(count%key==0){
                                arr[index]=0;
                        }
                        index++;
                        count++;
                }
                for (int i : arr) {
                        if(i!=0){
                                return i;
                        }
                }
                return -1;
        }
       
        public static boolean check(int[]arr) {
                int count=0;
                for (int i : arr) {
                        if(i!=0){
                                count++;
                        }
                        if(count>1){
                                return true;
                        }
                }
                return false;
        }
}
回复 使用道具 举报
就是第二轮的时候要注意,第一轮的3,6,9都已经不在了,要跳过计数
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马