通过率 66% · 提交 489 · 通过 321
小慕在玩一个游戏。系统发给他1+n张牌,每张牌上有一个整数。第一张牌归小慕所有,后面的n张牌按照发牌顺序排成连续的一行。 小慕需要判断,在后面的n张牌中,是否存在,使得这些牌上的数字之和能够小慕手中那张牌上的数字。
这类题属于华为 OD 机考真题方向中「200分 / 2024E」方向的高频题型,通常考察对「200分 / 2024E」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行有两个整数n和m,空格隔开。m代表发给小明牌上的数字。 第二行有n个数,代表后续发的n张牌上的数字,以空格隔开。
对每组输入,如果存在满足条件的连续若干张牌,则输出1;否则,输出0。
示例 1
输入示例
6 7 2 12 6 3 5 5
输出示例
1
小明牌的数字为7,再发了6张牌。第1、2两张牌教字和为14,可以整除7,输出1
示例 2
输入示例
10 11 1 1 1 1 1 1 1 1 1 1
输出示例
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
本题需要用到前缀和的概念。
对于一个给定的数列 A,它的前缀和数列 S 中 S[i+1] 表示从第 1 个元素到第 i 个元素的总和。
假设 nums 是一个 int 型列表,形如 sum(nums[0:i+1]) 就是从索引 0 对应的元素开始,累加到索引 i 对应的元素的前缀和。
例如 nums = [1, 2, 3, 4],那么其前缀和列表即为 pre_sum_lst = [0, 1, 3, 6, 10]。
前缀和的作用是可以在 O(1) 的时间复杂度下快速地计算出某段连续子数组的和。即:
例如对于上述 nums = [1, 2, 3, 4] 而言,如果想快速计算出子数组 nums[1:4] = [2, 3, 4] 的结果,只需要计算 pre_sum_lst[4] - pre_sum_lst[1] = 10 - 1 = 9 即为答案。
前缀和的作用也可以解释,为什么我们会把 0 也视为一个前缀和并且放在前缀和列表的第一个位置。由于设置了 pre_sum_lst[0] = 0,那么 pre_sum_lst[i] - pre_sum_lst[0] = sum(nums[:i]),才能够得到起始位置为原数组 nums 中第一个元素的连续子数组的和。
假设连续子数组 nums[i:j] 的和为 A,由上述关于前缀和的定义可知:
假设 A 是符合题意的连续子数组和(此时应该输出 1 作为结果),那么存在:
成立,即:
成立。打开括号并移项,可以得到:
成立。
因此,我们只需要找到两个前缀和 pre_sum_lst[i] 和 pre_sum_lst[j],能够满足上述式子,就可以说明存在符合题意的连续子数组了。
在本题中,只需要判断能否找到一个满足题意的连续子数组,显然下标的具体值并不重要。故我们可以直接使用一个哈希集合 pre_sum_set 来储存所有的前缀和对 m 求余的结果,而不用考虑下标。
我们可以在一个循环中对前缀和进行计算和判断,其具体流程如下:
1. 计算包含了 i 位置元素的前缀和 pre_sum 2. 计算当前前缀和对 m 的求余结果 pre_sum % m 3. 判断求余结果 pre_sum % m 是否位于哈希集合中,若:
m 求余可以得到一样的结果。退出循环,输出 14. 如果在上一步中没有退出循环,则将 pre_sum % m 存入哈希集合 pre_sum_set 中
将该核心逻辑转化为代码即为:
如果本题不仅要判断能否找到符合要求的连续子数组,还对题目做如下修改:
那么代码逻辑应该如何修改?
其中,第四种问法等价于 经典题型. 可被 K 整除的子数组。
边界与注意事项
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
0
小明牌的数字为11,再发了10张牌,这10张牌数字和为10,无法整除11,输出0。
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有