Java 十五只猴子围成一圈选大王问题

十五个猴子围成一圈选大王,依次1-7 循环报数,报到7 的猴子被淘汰,直到最后一只猴子成为大王。问,哪只猴子最后能成为大王。


需求:
选出一个大王。

思路:
将15只猴子封装为数组,用1–15表示。因为需求是要求出一个大王,也就是说这个数组到最后只能存在一个元素,那么就要定义循环。让15只猴子轮流自1–7循环报数,而报数为7的元素则要被删除。显然1次循环不可能达到需求,那么就要定义一个内层循环完成报数和删除操作,直到该数组只存在一个元素为止。
这里需要注意一点,报数时并非是循环结束了报数也要重新开始,而是当一个元素报数为7时,其余元素再重新开始报数。即使已经进入另一次循环,也要接续上个元素报的数。


步骤:
1、定义int数组arr,长度为15,元素值为1–15即代表了15只猴子的编号。
2、定义计数器counter 值为0,用于报数,只要counter=7,就对该元素操作,并计数器归0。
3、定义while循环,循环表达式为:arr.length!=1,因为只能有一个大王。
4、定义计数器a,值为0,用于记录每次循环时,对arr操作了几次,也就是说用于记录每一次循环有多少元素报数为7。
5、定义for循环,循环表达式为I"<"arr.length;只要一进入循环counter++。
6、定义if语句判断counter是否为7,是则arr[i]=0,计数器=0,a++。
7、for循环结束后新建一个数组newarr,长度为arr.length-a。它是用于将arr的无效下标删除。(0为无效下标)。
8、定义计数器index,值为0。它是用于newarr的下标。
9、定义for循环用于遍历数组。,循环表达式为i“<”arr.length。
10、使用if语句判断arr[i]!=0,是则newarr[index++] = arr[i]。
11、for循环结束后,a=newa。

public class Test
{
    public static void main(String[]args)
    {
            //功能:定义数组并向每个下标赋值
            int[] arr = new int[15];
            for(int i=0; i<arr.length; i++)
            {
                arr[i] = i;
            }
			
			//调用example方法,并由arr接收返回值
            int[] arr = example(arr);

        //打印arr[0]的原因:因为arr数组接收example的返回值后arr的长度为1。
			System.out.println("大王是编号为:"+arr[0]+” 的猴子“)
    }

    public static int[] example(int[] arr)
    {
        int counter = 0;

        while(arr.length!=1)
        {
            int a = 0;//用于记录每一次循环时对arr操作的次数

            //功能:将报数为7的元素变成无效元素
            for(int i=0; i<arr.length; i++)
            {
                counter++;
                if(counter==7)
                {
                    System.out.println("Test: 即将删除"+arr[i]);
                    arr[i] = 0;
                    counter = 0;
                    a++;
                }
             }
       
            //功能:将arr中存储无效元素的下标删除
            int[] newarr = new int[arr.length-a];
            int index = 0;
            for(int i=0; i<arr.length; i++)
            {
                if(arr[i]!=0)
                {
                    newarr[index++] = arr[i];
                }
            }
            arr = newarr;
        }
        renturn arr;
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值