通过率 42% · 提交 471 · 通过 196
给定两个字符集合,一个是全量字符集,一个是已占用字符集,已占用字符集中的字符不能再使用。 要求输出剩余可用字符集。
这类题属于华为 OD 机考真题方向中「100分 / 哈希表」方向的高频题型,通常考察对「100分 / 哈希表」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
示例 1
输入示例
a:3,b:5,c:2@a:1,b:2
输出示例
a:2,b:3,c:2
全量字符集为3个a,5个b,2个c 已占用字符集为1个a,2个b 由于已占用字符不能再使用 因此剩余可用字符为2个a,3个b,2个c 因此输出a:2,b:3,c:2
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
非常简单又直接的题目。
首先我们需要对输入的字符串进行解析,先根据切割符 "@" 将输入的原始字符串分割成前后两部分,s1 和 s2。将 s1 和 s2 分割为若干仅包含 "字母:数字" 的格式。即:
此处特别注意,s2 有可能为空,如果为空则直接设置 lst2 为空列表即可。
由于这是一个计数问题,很容易想到再进一步将全量字符集和已用字符储存在哈希表计数器中,将 "字母:数字" 格式分割为字母和数字。即:
数据计算方面也非常简单,我们仅需要考虑全量字符集 dic1 中的每一个键 k,将其出现的次数 dic1[k] 减去其在已用字符集中的出现次数 dic2[k],就可以得到剩余字符的情况,储存在 ans_dic 中。即:
要特别注意,如果 dic1[k]-dic2[k] == 0,则无需储存。修改代码为:
最终再次按照顺序遍历全量字符集,遍历 lst1 中的元素 item。将 "字母:数字" 格式分割为字母 ch 和数字。并且将在 ans_dic 中的次数情况,储存在一个新的列表 ans 中。
由于 ch 的数量可能降为 0,所以需要额外多一步判断 ch 是否位于 ans_dic 中。即:
复杂度分析 设全量字符集有 m 个「字母:数字」项、已用字符集有 k 项,输入串总长为 L。
整体时间复杂度为 O(L),与输入长度线性相关;全程没有排序和嵌套循环,瓶颈只是几次线性扫描。空间复杂度为 O(m + k),用于 dic1、dic2、ans_dic 与答案列表。 附注:C++ 参考实现使用 std::map,单次读写带 O(log m) 因子,总体为 O(L log m),量级上与 Python 版没有实质差别。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有