排查Python中getTotalX函数的逻辑错误
排查Python面试题:找介于两个数组之间的数的bug
嘿,我来帮你梳理这个问题的核心逻辑,以及常见的bug点,再给出正确的实现方案~
首先,我们得明确问题的两个核心条件,千万别搞反了:
- 目标整数必须满足:数组a中的每个元素都是它的因数 → 换句话说,这个整数能被a里的所有数整除(即
num % a_i == 0对所有a_i成立),也就是这个数是a的公倍数。 - 同时,这个整数必须是数组b中每个元素的因数 → 换句话说,b里的所有数都能被这个整数整除(即
b_i % num == 0对所有b_i成立),也就是这个数是b的公约数。
正确的解题思路
要高效解决这个问题,不用暴力遍历所有可能的数,而是可以按这三步来:
- 计算数组a的最小公倍数(LCM):所有满足第一个条件的数,一定是这个LCM的倍数。
- 计算数组b的最大公约数(GCD):所有满足第二个条件的数,一定是这个GCD的因数。
- 统计LCM的倍数中,不超过GCD且能整除GCD的数的数量——这些数就是同时满足两个条件的目标数。
比如样例输入:
- a = [2,4],LCM是4;b = [16,32,96],GCD是16。
- 4的倍数不超过16的有4、8、16,这三个数都能整除16,所以数量是3,和样例输出一致。
常见的bug点排查
你写的getTotalX函数出错,大概率是踩了下面这些坑:
条件判断搞反:
- 把第一个条件写成
a_i % num == 0(这是找a的公约数,不是公倍数); - 把第二个条件写成
num % b_i == 0(这是找b的公倍数,不是公约数)。
这是最容易犯的错误,直接导致结果完全不对。
- 把第一个条件写成
LCM/GCD计算错误:
- 计算多个数的LCM时,初始值设为0(正确应该用数组第一个元素作为初始值,再逐个迭代计算);
- 不知道两个数的LCM公式:
LCM(a,b) = a*b // GCD(a,b),自己硬写逻辑导致出错; - 计算多个数的GCD时,迭代逻辑错误,比如没有用欧几里得算法,而是用了错误的判断。
遍历范围错误:
- 暴力遍历1到b的最大值,而不是从a的LCM开始到b的GCD结束,不仅效率低,还容易漏判或多判;
- 遍历步长不是LCM,而是1,导致重复检查很多不符合第一个条件的数。
正确的getTotalX实现
这里给出一个经过验证的实现,你可以对比自己的代码找差异:
import math # 计算两个数的最大公约数(欧几里得算法) def calculate_gcd(a, b): while b != 0: a, b = b, a % b return a # 计算两个数的最小公倍数 def calculate_lcm(a, b): return a * b // calculate_gcd(a, b) def getTotalX(a, b): # 计算数组a的最小公倍数 a_lcm = a[0] for num in a[1:]: a_lcm = calculate_lcm(a_lcm, num) # 计算数组b的最大公约数 b_gcd = b[0] for num in b[1:]: b_gcd = calculate_gcd(b_gcd, num) # 统计符合条件的数的数量 count = 0 current_multiple = a_lcm while current_multiple <= b_gcd: if b_gcd % current_multiple == 0: count += 1 current_multiple += a_lcm return count
测试样例
把样例输入代入:
a = [2,4] b = [16,32,96] print(getTotalX(a, b)) # 输出3,符合预期
你可以对照这个实现,检查自己的代码哪里出现了上述的bug,应该就能快速定位问题啦~
内容的提问来源于stack exchange,提问作者user9782693
相关产品推荐
相关产品推荐

