华为OD机试D卷C卷 - 手机App防沉迷系统(C++ Java JavaScript Python C语言)

本文介绍了华为OD机试的一道题目,涉及如何编程实现手机App防沉迷系统。系统依据App的优先级管理允许使用时段,避免时间冲突。文章提供了C++、Java、JavaScript和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表示空闲时间

用例2

输入

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

解题思路

  1. 定义App类:首先,我们定义了一个App类来存储每个App的相关信息,包括名称、优先级、起始时间和结束时间。

  2. <
<think>好的,我现在需要帮助用户理解如何在代码中实现字符串的字典序比较,以及相关的算法细节。用户之前已经问过比较两个名字的字典排序,我给出了不同语言实现方法。现在用户进一步询问具体的实施过程和算法细节,可能涉及编程实现。 首先,我需要回顾之前的对话,确保这次回答保持一致。用户提供的站内引用中有几个相关的点,比如华为OD题中通过交换生成最小字典序字符串,字典序的基本规则,以及不同语言中的实现方法,如C、C++JavaPython等。引用中还提到了字典树,但用户当前的问题可能更关注直接的比较方法,而不是数据结构。 用户的问题可以分为几个部分:字典排序比较的具体实施过程、编程实现、字典序算法的实现细节。需要结合不同语言,展示如何从底层实现字典序比较,而不仅仅是调用内置函数。同时,可能需要解释算法步骤,比如逐个字符比较,处理不同长度的情况等。 需要确保回答结构清晰,分步骤说明原理,然后给出不同语言实现示例。可能还需要提到优化点,比如提前终止比较,处理大小写,或者Unicode字符的问题。此外,用户可能对中文字符的比较感兴趣,因为之前的回答提到了中文字符串的比较,这里需要进一步解释。 要注意用户提供的引用中的信息,比如引用[2]提到字典序的比较取决于第一个不同的字符,以及前缀的情况,这需要在原理部分强调。引用[3]提到C语言中的strcmp和字典树,但用户现在的问题可能更关注直接的比较算法,所以可能不需要深入字典树,除非有必要扩展。 另外,用户可能对如何手动实现比较函数感兴趣,而不仅仅是使用内置库。因此,需要展示如何在不使用strcmp或compareTo的情况下,自己编写比较逻辑,比如使用循环逐个字符对比。 最后,确保回答包含相关问题,帮助用户进一步探索,比如如何处理大小写、不同语言实现的差异、中文字符比较的注意事项等。需要检查之前的回答中的相关问题,避免重复,同时补充新的相关问题。 总结回答结构: 1. 字典序比较的核心原理:逐字符比较,处理不同长度。 2. 分语言实现手动比较函数:PythonJava、C、JavaScript。 3. 关键处理细节:提前终止、长度差异、Unicode/ASCII处理。 4. 相关问题扩展。 需要验证每个代码示例的正确性,例如在Python中循环遍历字符,比较ord值,处理长度差异。在C语言中手动实现类似strcmp的函数,注意指针和字符数组的处理。在JavaScript中处理可能的UTF-16编码问题,尤其是中文字符。 同时,要提到实际开发中推荐使用内置函数,但手动实现有助于理解原理。此外,注意用户可能的应用场景,如算法题中的字符串操作,需要高效的比较方法,或者自定义比较规则的情况。</think>### 字典序比较的具体实现过程与代码示例 字典序比较的核心在于**逐字符比较编码值**,处理不同长度字符串的关系。以下是分步骤说明与多语言实现--- #### **一、字典序比较的核心原理** 1. **逐字符对比** 从索引0开始,逐个比较两个字符串对应位置的字符编码(ASCII/Unicode),直到发现第一个不相同的字符。 - 若发现不同字符:返回两字符的编码差值(正数或负数) - 若所有字符相同:比较字符串长度,短字符串字典序更小 2. **终止条件** - 当遇到第一个不同字符时直接返回结果 - 当较短字符串是长字符串的前缀时,返回长度差[^2] --- #### **二、分语言实现字典序比较** ##### **1. Python手动实现** ```python def compare_dict_order(s1, s2): min_len = min(len(s1), len(s2)) for i in range(min_len): diff = ord(s1[i]) - ord(s2[i]) if diff != 0: return diff # 返回首个不同字符的差值 return len(s1) - len(s2) # 处理长度差异 # 示例 print(compare_dict_order("apple", "banana")) # -1 ('a'=97 vs 'b'=98) print(compare_dict_order("王五", "赵六")) # 中文字符按Unicode比较 ``` ##### **2. Java手动实现** ```java public static int compareDictOrder(String s1, String s2) { int minLen = Math.min(s1.length(), s2.length()); for (int i = 0; i < minLen; i++) { int diff = s1.charAt(i) - s2.charAt(i); if (diff != 0) return diff; } return s1.length() - s2.length(); } // 示例:System.out.println(compareDictOrder("张三", "李四")); // 输出Unicode差值 ``` ##### **3. C语言手动实现(模拟strcmp)** ```c int custom_strcmp(const char *s1, const char *s2) { while (*s1 && *s2 && *s1 == *s2) { s1++; s2++; } return (*s1 - *s2); // 自动处理长度差异('\0'的ASCII为0) } // 示例:printf("%d", custom_strcmp("apple", "app")); // 输出'e'(101) - '\0'(0) = 101 ``` ##### **4. JavaScript手动实现** ```javascript function compareDictOrder(s1, s2) { const minLen = Math.min(s1.length, s2.length); for (let i = 0; i < minLen; i++) { const diff = s1.charCodeAt(i) - s2.charCodeAt(i); if (diff !== 0) return diff; } return s1.length - s2.length; } // 示例:console.log(compareDictOrder("zoo", "apple")); // 正数('z' > 'a') ``` --- #### **三、关键处理细节** 1. **提前终止优化** 发现第一个不同字符时立即终止比较,时间复杂度最优为$O(\min(n,m))$[^2]。 2. **长度差异处理** 若字符完全相同但长度不同,长度更短者字典序更小(如`"app" < "apple"`)。 3. **Unicode与多字节字符** - 中文字符按Unicode编码比较(如`"王"(U+738B)`与`"赵"(U+8D75)`) - JavaScript使用UTF-16编码,需注意代理对字符(如某些Emoji) 4. **大小写敏感** 默认区分大小写(`'A'(65) < 'a'(97)`),若需忽略大小写需预处理: ```python s1_lower = s1.lower() # Python示例 ``` --- #### **四、应用场景** 1. **字符串排序算法** 快速排序、归排序中依赖字典序比较(如对文件名列表排序)。 2. **数据校验** 检测字符串是否按字典序递增排列。 3. **算法题** 如华为OD题中“通过一次交换生成最小字典序字符串”[^1]。 --- ### 相关问题 1. 如何实现忽略大小写的字典序比较? 2. 中文字符串比较时需要注意哪些编码问题? 3. 字典序比较在数据库索引中有哪些应用? 4. 如何优化大规模字符串集合的字典序排序性能? --- 通过理解底层原理与手动实现,可以更灵活地处理自定义比较规则(如特殊字符优先级),这在算法竞赛和系统开发中尤为重要[^3][^4]。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

算法大师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值