
华为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
五、解题思路
这是一个动态队列模拟问题,核心规则包括:
- 基础顺序
- 先按“是否优先面试”
- 再按“预约顺序”
- 过号规则
- 第 x 次过号 → 向后移动 2^(x-1) 位
- 超出队尾 → 放到队尾
- 被过号的人 不会消失,后续仍会被叫到
- 优先面试规则
- 优先面试者一开始提前
- 如果优先面试者被过号一次 → 取消优先资格
- 输出
- 每次叫号都要输出
- 格式:编号:姓名:是否过号(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算法的适用场景,发现新题目,随时更新,全天优快云在线答疑。

59

被折叠的 条评论
为什么被折叠?



