华为OD机试 - 面试叫号系统 - 动态队列(Java 双机位C卷 200分)

在这里插入图片描述

华为OD机试 双机位C卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。

一、题目描述

某公司举行招聘会,面试官通过叫号系统,按照应聘者的预约先后次序依次呼叫应聘者面试。

如果被叫到的应聘者没有及时到场,面试官叫不到人就会过号处理。

第一次过号的应聘者会被安排到下一位,第二次过号则会排队下两位,第三次过号则会被安排到下四位。

以此类推,按2^x的次序计算步长,过号次数越多则排队越后,直至队尾。也有人因为某些原因需要优先面试,优先面试的人会被提前叫号,如果优先面试的人未及时到场,则取消优先面试资格,按约定规则处理。

请写一段程序,实现以上排队叫号功能。

二、输入描述

每行输入1个应聘者预约消息,依次为应聘者编号、姓名、是否优先面试(true 是, false 否)、预约顺序(整数1至1000)、过号次数(整数0至10),最后一行以Exit结束。

三、输出描述

从第1个人开始叫号,输出所有被叫到的应聘者信息,格式为编号:姓名:是否过号(过号输出Y,否则输出N)

补充:不需要考虑人员自始至终未到场的情况。

四、测试用例

1、输入

A01 Oliver false 1 0
A02 James false 2 0
A03 william false 3 0
A04 Henry true 4 0
A05 Lucas true 5 0
Exit

2、输出

A04:Henry:N
A05:Lucas:N
A01:Oliver:N
A02:James:N
A03:William:N

3、说明

针对有设置优先面试、没有应聘者过号的场景依次输入5个应聘者预约信息,面试官依次叫号,因为编号A04、A05的应聘者设置了优先面试,并且A04的预约顺序是4,要先于A05,所以先输出A04,然后输出A05,然后按预约顺序依次输出A01、A02、A03

五、解题思路

这是一个动态队列模拟问题,核心规则包括:

  1. 基础顺序
  • 先按“是否优先面试”
  • 再按“预约顺序”
  1. 过号规则
    • 第 x 次过号 → 向后移动 2^(x-1) 位
    • 超出队尾 → 放到队尾
    • 被过号的人 不会消失,后续仍会被叫到
  2. 优先面试规则
    • 优先面试者一开始提前
    • 如果优先面试者被过号一次 → 取消优先资格
  3. 输出
    • 每次叫号都要输出
    • 格式:编号:姓名:是否过号(Y/N)

六、Java算法源码

public class OdTest {
    /**
     * 应聘者实体类
     */
    static class Applicant {
        String id;
        String name;
        boolean priority;
        int order;
        int missCount;

        Applicant(String id, String name, boolean priority, int order, int missCount) {
            this.id = id;
            this.name = name;
            this.priority = priority;
            this.order = order;
            this.missCount = missCount;
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        List<Applicant> list = new ArrayList<>();

        // 读取输入
        while (sc.hasNext()) {
            String id = sc.next();
            if ("Exit".equals(id)) break;
            String name = sc.next();
            boolean priority = Boolean.parseBoolean(sc.next());
            int order = sc.nextInt();
            int miss = sc.nextInt();
            list.add(new Applicant(id, name, priority, order, miss));
        }

        // 初始排序:优先面试在前,其次预约顺序
        list.sort((a, b) -> {
            if (a.priority != b.priority) {
                return b.priority ? 1 : -1;
            }
            return a.order - b.order;
        });

        LinkedList<Applicant> queue = new LinkedList<>(list);

        // 模拟叫号
        while (!queue.isEmpty()) {
            Applicant cur = queue.pollFirst();

            // 是否过号
            if (cur.missCount > 0) {
                System.out.println(cur.id + ":" + cur.name + ":Y");

                // 过号一次,优先资格取消
                cur.priority = false;
                cur.missCount--;

                // 计算步长:2^(原过号次数)
                int step = (int) Math.pow(2, cur.missCount);
                int newIndex = Math.min(step, queue.size());

                queue.add(newIndex, cur);
            } else {
                System.out.println(cur.id + ":" + cur.name + ":N");
            }
        }
    }
}

七、效果展示

1、输入

A01 Oliver true 1 1
A02 James false 2 2
A03 William false 3 0
A04 Henry false 4 0
Ae5 Lucas true 5 0
Exit

2、输出

A01:Oliver:Y
Ae5:Lucas:N
A01:Oliver:N
A02:James:Y
A03:William:N
A04:Henry:N
A02:James:Y
A02:James:N

3、说明

说明: 针对有设置优先面试、 有应聘者过号的场景依次输入5个应聘者预约信息, 面试官依次叫号, 因为编号A01、 A05的应聘者设置了优先面试, 并且A01的预约顺序是1, 所以先优先叫号A01, 因其过号1次自动排到A05之后。 接着依次完成A05、 A01叫号后, 最后按预约顺序从A02被叫号并触发过号1次过程, 随后依次到A03、 A02再次过号、 然后排位2位到最后, 最后依次完成A04、 A02叫号。
在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 双机位C卷 200分)

🏆本专栏收录于《华为OD机试(JAVA)真题》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值