3.选队长_easy_20210124

3.选队长_easy_20210124

3.1.任务描述

  • 今天同学们相约一起爬山游玩,为了更好的进行这场活动,大家准备推举一个人作为出游的临时队长。为了体现合理公平,大家提出了一个比较有趣的规则。所有人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子,剩下的人继续报数,最后留下的当选为队长。请你通过编写程序,求出一组人中的队长是原来第几位同学。

3.2.思路

  1. 数组作为容器,count作为计数器,每当count值为3则调用kickOff方法剔除相应的同学,kickOff是自己封装的一个数组复制到新数组的方法,使用System中的arraycopy方法复制指定位置指定长度。
  2. 当count值为4时重新计数1;for循环进行一轮轮剔除,当数组长度为1时停止循环,队长诞生。
package demo5;

import java.util.Arrays;
import java.util.Scanner;

public class Demo {
    public static class Main2 {
        public static void main(String[] args) {
            System.out.println("输入一个初始的队伍长度:");
            int len = new Scanner(System.in).nextInt();
            int[] arr=initArr(len);
            System.out.println("初始数组:");
            showArray(arr);
            int count=1;//报数起始数字1,count变量做计数器
            int round=1;
            while(arr.length>1){ //剩下一人时停止循环
                System.out.print("第"+(round++)+"轮:");
                for (int i = 0; i < arr.length; i++) {
                    if (count==3){
                        arr = kickOff(arr, i);
                        //count变量做计数器,每当计数到3就剔除对应数组元素
                        i--;
                        //新数组arr中当前i下标元素是被剔除元素的后一位,避免遗漏先i--后再i++
                    }
                    count++;
                    if (count==4){
                        count=1;
                    }
                }
                showArray(arr);
            }

        }


        /**
         * 显示数组
         * @param a
         */
        private static void showArray(int a[]){
            System.out.println(Arrays.toString(a));
            //Arrays数组工具类中toString将数组化成字符串
        }

        /**
         * 初始化数组
         * @param len
         */
        private static int[] initArr(int len) {
            int[] arr=new int[len];
            for (int i=0;i<arr.length;i++){
                arr[i]=i+1;
            }
            return arr;
        }

        /**
         * 剔除数组中某个元素,将剩下元素依次复制到新的数组中,需复制两次
         * public static void arraycopy(Object src,int srcPos,Object dest,int desPos,
           int  length):将数组中指定的数据拷贝到另一个数组中。
         * 参数:
         *      src:源数组
         *      srcPos:源数组中的起始位置
         *      dest:目标数组
         *      destPos:目标数组中的起始位置
         *      length:要复制的数组元素的数量。
         * @param a
         * @param index  数组下标
         * @return
         */
        private static int[] kickOff(int[] a,int index){
            int[] b=new int[a.length-1]; //新数组
            System.arraycopy(a,0,b,0,index); //将数组下标index之前元素复制到b
            System.arraycopy(a,index+1,b,index,a.length-1-index);//将index后面元素复制到b
            return b;
        }
    }
}

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页