华为OD笔试机试 - 手机App防沉迷系统 (Java 2024年C卷D卷真题算法)

华为OD机试(C卷+D卷)2024真题目录(Java & c++ & python)

题目描述

智能手机方便了我们生活的同时,也侵占了我们不少的时间。“手机App防沉迷系统”能够让我们每天合理地规划手机App使用时间,在正确的时间做正确的事。

它的大概原理是这样的:

  1. 在一天24小时内,可以注册每个App的允许使用时段
  2. 一个时间段只能使用一个App
  3. App有优先级,数值越高,优先级越高。注册使用时段时,如果高优先级的App时间和低优先级的时段有冲突,则系统会自动注销低优先级的时段,如果App的优先级相同,则后添加的App不能注册。

请编程实现,根据输入数据注册App,并根据输入的时间点,返回时间点使用的App名称,如果该时间点没有注册任何App,请返回字符串“NA”。

输入描述

第一行表示注册的App数量 N(N ≤ 100)

第二部分包括 N 行,每行表示一条App注册数据

最后一行输入一个时间点,程序即返回该时间点使用的App

2
App1 1 09:00 10:00
App2 2 11:00 11:30
09:30

数据说明如下:

  1. N行注册数据以空格分隔,四项数依次表示:App名称、优先级、起始时间、结束时间
  2. 优先级1~5,数字越大,优先级越高
  3. 时间格式 HH:MM,小时和分钟都是两位,不足两位前面补0
  4. 起始时间需小于结束时间,否则注册不上
  5. 注册信息中的时间段包含起始时间点,不包含结束时间点

输出描述

输出一个字符串,表示App名称,或NA表示空闲时间

用例1

输入

1
App1 1 09:00 10:00
09:30

输出

App1

说明

App1注册在9点到10点间,9点半可用的应用名是App1

用例2

输入

2
App1 1 09:00 10:00
App2 2 09:10 09:30
09:20

输出

App2

说明

ApP1和App2的时段有冲突,App2优先级高,注册App2之后,App1自动注销,因此输出App2。

用例3
输入

2
App1 1 09:00 10:00
App2 2 09:10 09:30
09:50

输出

NA

说明: App1被注销后,09:50时刻没有应用注册,因此输出NA

解题思路

提前将输入的App按照优先级降序(对于优先级相同的App,保持输入顺序,即稳定排序),此时我们会先注册高优先级的App,这样的话,后注册的App只要和前面注册的App发生冲突,则必然无法注册,因为前面已注册App的优先级必然更高。

比如输入的App注册顺序如下

App1 1 09:00 10:00
App2 5 10:10 10:30
App3 3 09:10 10:30

按照优先级降序后,变为了

App2 5 10:10 10:30
App3 3 09:10 10:30
App1 1 09:00 10:00

此时注册结果不变,因为我们可以发现:

  • 如果不存在App_low和高优先级App_high有冲突,则高优先级App_high提前注册对结果无影响
  • 如果存在App_low和高优先级App_high有冲突,则无论App_high在App_low前面注册,还是在App_low后面注册,结果都是App_low无法注册

参考代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class App {
    String name;
    int priority;
    int startTime;
    int endTime;

    public App(String name, int priority, int startTime, int endTime) {
        this.name = name;
        this.priority = priority;
        this.startTime = startTime;
        this.endTime = endTime;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();
        
        List<App> apps = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            apps.add(new App(sc.next(), sc.nextInt(), convert(sc.next()), convert(sc.next())));
        }
        
        int queryTime = convert(sc.next());
        sc.close();
        
        System.out.println(findRegisteredApp(apps, queryTime));
    }

    public static String findRegisteredApp(List<App> apps, int queryTime) {
        List<App> registeredApps = new ArrayList<>();
        
        apps.sort((a, b) -> Integer.compare(b.priority, a.priority));
        
        for (App app : apps) {
            if (app.startTime >= app.endTime) continue;

            boolean conflict = false;
            for (App registered : registeredApps) {
                if (hasConflict(app, registered)) {
                    conflict = true;
                    break;
                }
            }
            
            if (!conflict) {
                registeredApps.add(app);
            }
        }
        
        for (App app : registeredApps) {
            if (queryTime >= app.startTime && queryTime < app.endTime) {
                return app.name;
            }
        }
        
        return "NA";
    }

    public static int convert(String time) {
        String[] parts = time.split(":");
        int hours = Integer.parseInt(parts[0]);
        int minutes = Integer.parseInt(parts[1]);
        return hours * 60 + minutes;
    }

    private static boolean hasConflict(App app1, App app2) {
        return (app1.startTime < app2.endTime && app1.endTime > app2.startTime);
    }
}

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
华为OD机试-B代表团坐车Java实现如下: 可以使用Java中的对象和类来实现代表团坐车的功能。 首先,我们可以创建一个代表团类(DelegateGroup),用于存储代表团中每个成员的姓名、目的地和乘车状态等信息。在代表团类中可以定义成员变量name、destination和status等,并添加相应的getter和setter方法。 然后,我们可以创建一个乘车类(Bus),表示可以坐的公共交通工具。在乘车类中可以定义一个成员变量capacity,表示公共交通工具的总容量,以及一个成员变量occupied,表示当前已经被占用的座位数量。同样,还可以添加getter和setter方法。 接下来,在主程序中,我们可以实例化几个代表团对象,例如通过DelegateGroup类创建代表团成员A、B、C等,并为每个成员指定目的地和乘车状态等信息。 然后,我们可以实例化一个公共交通工具对象,例如通过Bus类创建一个公交车对象bus,并设置总容量和当前已被占用的座位数量等信息。 接着,我们可以通过循环遍历代表团成员,根据成员的乘车状态来判断是否可以为该成员分配座位。如果成员的乘车状态为“需要乘车”且公共交通工具的座位尚未全部被占用,那么可以为该成员分配一个座位,并将公共交通工具的已占用座位数量加1。如果成员的乘车状态为“不需要乘车”或公共交通工具的座位已全部占满,那么不为该成员分配座位。 最后,我们可以输出每个代表团成员的姓名、目的地和乘车状态,并输出公共交通工具的总容量和已占用座位数量等信息。 以上就是用Java实现代表团坐车功能的简单示例。还可以根据实际需求进行扩展和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值