华为 · 哈希 · 算法编程题
华为 哈希 n ≤ 100 时限 1 秒 / 32 MB

题目描述

信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码、QQ 用户、手机号码、银行帐号等信息及活动记录。采集输入大数据和分类规则,通过大数据分类处理程序,将大数据分类输出。
对于给定的分类规则集 R = R_1, R_2, ..., R_m ,规范化它,具体地:
将 R 中的整数按从小到大的顺序重新排序;
去除 R 中的重复元素;
记规范化后的分类规则集为 r = r_1, r_2, ..., r_m 。
对于收集到的、由若干个整数组成的数据集 I ,按照下方的要求,使用规范后的分类规则集 r 输出分类后的结果。
对于第 i 条分类规则 r_i ,如果 I 中存在以 r_i 为连续子串的整数,则该规则集有效;进一步地,你需要输出有多少条数据符合该规则,以及这些数据在 I 中的位置、数据本身。
子串为从原字符串中,连续的选择一段字符(可以全选、可以不选)得到的新字符串。对应本题中,你需要将整数看作是数字字符串。

输入输出

输入描述
第一行先输入一个整数 n (1 ≤ n ≤ 100) 代表数据集 I 中的数据条数。随后,在同一行输出 n 个整数 I_1, I_2, ..., I_n (0 ≤ I_i < 2^31) 代表数据。
第二行先输入一个整数 m (1 ≤ m ≤ 100) 代表分类规则集 R 中的规则条数。随后,在同一行输出 m 个整数 R_1, R_2, ..., R_m (0 ≤ R_i < 2^31) 代表规则。
输出描述
在一行上:
_1. 先输出一个整数 k ,代表一共需要输出的数字个数。简单地说,这个数字为下文中你输出数量的个数统计。
_2. 随后,对于规范后的每一条规则,如果其有效:先输出这条规则本身,随后输出一个整数 p ,代表符合该规则的数据条数;随后输出 p 个二元组 id_1, I_id_1, id_2, I_id_2, ..., id_p, I_id_p ,代表符合这条规则的数据在 I 中的位置、数据本身。其中,位置从 0 开始计数。如果其无效,则跳过这条规则。

样例共 1 组

样例 1 · 在这组样例中,给定的原始数据集为 I = \123, 456, 786, 453, 46, 7, 5, 3, 665, 453456, 745, 456, 786, 453, 123 ,给定的原始规则集为 R = \6, 3, 0 。 规范化后的规则集为 r=\0,3,6 。 随后,对 I 进行分类处理: 对于规则 r_0=0 ,由于 I 中不存在以 0 为连续子串的数据,因此该规则无效,跳过; 对于规则 r_1=3 , I 中以 3 为连续子串的数据有: I_0 = 12orange3 、 I_3 = 45orange3 、 I_7 = orange3 、 I_9 = 45orange3456 、 I_13 = 45orange3 、 I_14 = 12orange3 ,因此该规则有效。根据输出描述,先输出规则本身 "3" 、随后输出符合要求的条数 "3 6" 、随后输出符合要求的数据在 I 中的位置和整数本身 "3 6 0 123 3 453 7 3 9 453456 13 453 14 123" ; 对于规则 r_2=6 , I 中以 6 为连续子串的数据有: I_1 = 45orange6 、 I_2 = 78orange6 、 I_4 = 4orange6 、 I_8 = orange665 、 I_9 = 45345orange6 、 I_11 = 45orange6 、 I_12 = 78orange6 ,因此该规则有效。根据输出描述,先输出规则本身 "6" 、随后输出符合要求的条数 "6 7" 、随后输出符合要求的数据在 I 中的位置和整数本身。 不要忘了在输出开始的整数 k ,在这个样例中,一共输出了 30 个数字,所以 k = 30 。
输入
15 123 456 786 453 46 7 5 3 665 453456 745 456 786 453 123
5 6 3 6 3 0
输出
30 3 6 0 123 3 453 7 3 9 453456 13 453 14 123 6 7 1 456 2 786 4 46 8 665 9 453456 11 456 12 786

算法解析依据充分

考点:哈希 · 排序 · 模拟

数据规模 n ≤ 100 | 限制 1 秒 / 32MB | 标准输入输出

题目画像

  • 数据规模:n ≤ 100,m ≤ 100
  • 元素值域:I_i ≤ 2,R_i ≤ 2(注意整数类型选择,避免溢出)
  • 复杂度门槛:允许 O(n³) ~ O(n⁴) 的多重循环,可以放心枚举。
  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:哈希

用哈希表把「查找/计数」的开销降到 O(1) 均摊。

思路框架(哈希 通法 · 非本题专属)

  1. 一次遍历,把元素作为 key、出现次数/首次位置作为 value 存进哈希表。
  2. 第二次遍历(或边扫边查)拿到需要的信息。
  3. 注意哈希无序:需要按原顺序输出时要额外记录顺序。

实现要点:Python 用 dict / collections.Counter / defaultdict;C++ 用 unordered_map。

复杂度:时间 O(n) 均摊 | 空间 O(n)

该范式的通法易错点

  • 遍历哈希表时依赖了不存在的顺序。
  • 多次查询时每次都重新统计。

对照本题

  • 数据规模 n ≤ 100,允许 O(n³) ~ O(n⁴) 的多重循环,可以放心枚举。
  • 元素值域最大到 2 —— 求和 / 相乘时记得开 64 位整数。

样例解读

样例 1:输入 15 123 456 786 453 46 7 5 3 665 453456 745 456 786 453 123 / 5 6 3 6 3 0 → 输出 30 3 6 0 123 3 453 7 3 9 453456 13 453 14 123 6 7 1 456 2 786 4 46 8 665 9 453456 11 456 12 786

在这组样例中,给定的原始数据集为 I = \123, 456, 786, 453, 46, 7, 5, 3, 665, 453456, 745, 456, 786, 453, 123 ,给定的原始规则集为 R = \6, 3, 0 。

规范化后的规则集为 r=\0,3,6 。

随后,对 I 进行分类处理:

对于规则 r_0=0 ,由于 I 中不存在以 0 为连续子串的数据,因此该规则无效,跳过;

对于规则 r_1=3 , I 中以 3 为连续子串的数据有: I_0 = 12orange3 、 I_3 = 45orange3 、 I_7 = orange3 、 I_9 = 45orange3456 、 I_13 = 45orange3 、 I_14 = 12orange3 ,因此该规则有效。根据输出描述,先输出规则本身 "3" 、随后输出符合要求的条数 "3 6" 、随后输出符合要求的数据在

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:华为机试编程模拟题8。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解