【Android面试】使用Java,有n个人(编号1~n围成一圈),从编号为1的开始报数,从1报数到m,报到m的人出去,下一个人继续从1开始报数,通过算法求最后一个留下的人的编号为多少

简介: 比如n=3,m=4有3个人,从1报到4第一次出队:1号第二次出队:3号最后留下:2号

比如n=3,m=4

有3个人,从1报到4

第一次出队:1号

第二次出队:3号

最后留下:2号

使用链表来做最方便。


import java.util.Scanner;
public class LastOneStanding {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入人数n和报数范围m:");
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[] nums = new int[n]; // 存储每个人的编号
        for (int i = 0; i < n; i++) {
            nums[i] = i + 1;
        }
        int lastIdx = 0; // 最后一个留下的人的编号初始化为0
        while (nums.length > 1) { // 当链表长度大于1时,继续循环
            int startIdx = 0; // 从哪个位置开始报数
            if (lastIdx == nums.length - 1) { // 如果上一个人是最后一个离开的人,从头开始报数
                startIdx = 0;
            } else { // 否则从上一个人的下一个位置开始报数
                startIdx = lastIdx + 1;
            }
            for (int i = startIdx; i < nums.length; i++) { // 从指定位置开始报数
                if (i == m) { // 如果报到m的人出去了,更新链表头指针和剩余人数
                    int nextIdx = nums[i % nums.length];
                    nums[0] = nextIdx;
                    lastIdx = 0;
                    if (nums.length == 1) { // 如果链表长度为1,说明只剩下一个人了,输出他的编号
                        System.out.println(nums[0]);
                        break;
                    }
                    nums[1] = nums[nums.length - 1]; // 将尾节点接在头节点后面,形成一个单节点的循环链表
                    nums[nums.length - 1] = 0; // 将尾节点置为0,表示已经删除掉该节点
                    nums[0] = i + 1; // 将新节点的编号设为i+1,表示该节点是新的头节点
                } else { // 如果没有报到m的人,将当前节点的编号加入到剩余人数中,并更新链表头指针和剩余人数
                    lastIdx++;
                }
            }
        }
        System.out.println("最后留下的人的编号为:" + nums[0]);
    }
}

目录
相关文章
|
21天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
27天前
|
Java 程序员
java线程池讲解面试
java线程池讲解面试
50 1
|
16天前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
31 0
|
15小时前
|
存储 安全 Java
[Java基础面试题] Map 接口相关
[Java基础面试题] Map 接口相关
|
15小时前
|
Java
[Java 面试题] ArrayList篇
[Java 面试题] ArrayList篇
|
1天前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
8 1
|
1天前
|
存储 安全 Java
每日一道Java面试题:说一说Java中的泛型?
今天的每日一道Java面试题聊的是Java中的泛型,泛型在面试的时候偶尔会被提及,频率不是特别高,但在日后的开发工作中,却是是个高频词汇,因此,我们有必要去认真的学习它。
3 0
|
1天前
|
Java 编译器
每日一道Java面试题:方法重载与方法重写,这把指定让你明明白白!
每日一道Java面试题:方法重载与方法重写,这把指定让你明明白白!
3 0
|
5天前
|
XML 缓存 Java
Java大厂面试题
Java大厂面试题
18 0
|
5天前
|
存储 安全 Java
Java大厂面试题
Java大厂面试题
11 0