java实现 经典算法题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号。

偶然间刷题看到, 在此分享下解答流程思路

首先n个人报数, 只留下最后一人, 由此可知, 具体需要的循环次数我们并不知道(可以用while, 这里采用的是for循环), 我们可以采用一个数组保存这n个人, 设置一个变量currentNum保存当前报数的数字, 设置一个count记录还剩多少人, 剩余一人break跳出循环, 当数组遍历到尾时, 设置下标为0重新循环, 代码如下:

/**
     * 题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
     * 例如;如果10个人 留下的是4号
     */
   public static void main(String[] args) {
        String[] arr = {"one", "two", "three", "four", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth"};
        // 当前报数字
        int currentNum = 1;
        int count = arr.length;
        for (int i = 0; ; i++) {
            // 只剩一人, 跳出循环
            if (count==1) {
                break;
            }
            // 循环结束重新遍历
            if (i >= arr.length) {
                i = 0;
            }
            // 当arr[i]为null是, 跳过此次循环, 注意: 此次i值增加, currentNum不变
            if (arr[i] == null) {
                continue;
            }
            // currentNum为3时, 减少一人
            if (currentNum % 3 == 0) {
                count--;
                arr[i] = null;
            }
            // 改变currentNum的值, 超过三重新设置为1
            if (currentNum == 3) {
                currentNum = 1;
            } else {
                currentNum++;
            }
        }
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != null) {
                System.out.println("留下的为" + (i+1) + "号");
            }
        }
        System.out.println(Arrays.toString(arr));
    }

控制台打印结果
在这里插入图片描述

此处人数是固定的, 也可以通过键盘输入动态生成, 这里不做具体演示了

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值