CodeSignal adjacentElementsProduct挑战:编写的While循环为何挂起?
adjacentElementsProduct 代码问题排查与修复
错误原因
- 死循环导致程序挂起:while循环条件为
universalTracker != (arrayLength - 1),但每次循环universalTracker += 2。以示例数组长度6为例,arrayLength - 1 = 5,变量从0开始累加2,会依次变成0→2→4→6→8…永远无法等于5,循环永远不会终止。 - 相邻元素遍历逻辑错误:每次步长为2,会跳过大量相邻元素对,比如示例中的(6,-2)、(-5,7)都没被计算,根本没覆盖所有相邻元素组合。
- 变量未动态更新:
firstNum和secondNum仅在函数开头赋值一次,后续循环中没有根据universalTracker的变化重新取值,导致每次计算的都是第一对元素的乘积。 - 初始值设置不合理:
highestProduct初始设为0,若所有相邻元素的乘积都是负数,最终结果会错误返回0,不符合题目要求。 - 缺少返回值:原代码没有返回计算结果,即使逻辑正确也无法输出答案。
可行解决方案
方案一:使用for循环实现
def adjacentElementsProduct(inputArray): # 用第一对相邻元素的乘积初始化最大值,适配全负数场景 highestProduct = inputArray[0] * inputArray[1] # 遍历从索引1开始,到倒数第二个元素结束 for i in range(1, len(inputArray) - 1): currentProduct = inputArray[i] * inputArray[i+1] if currentProduct > highestProduct: highestProduct = currentProduct return highestProduct print(adjacentElementsProduct([3, 6, -2, -5, 7, 3]))
方案二:修正while循环实现
def adjacentElementsProduct(inputArray): highestProduct = inputArray[0] * inputArray[1] universalTracker = 0 arrayLength = len(inputArray) # 循环条件改为索引小于倒数第二个元素,避免死循环 while universalTracker < arrayLength - 1: currentProduct = inputArray[universalTracker] * inputArray[universalTracker + 1] if currentProduct > highestProduct: highestProduct = currentProduct # 步长改为1,遍历每一对相邻元素 universalTracker += 1 return highestProduct print(adjacentElementsProduct([3, 6, -2, -5, 7, 3]))
原理说明
- 解决死循环:将while循环条件改为
universalTracker < arrayLength - 1,只要索引还没到倒数第二个元素,就继续循环;同时步长改为1,确保索引能逐步递增到终止条件。 - 覆盖所有相邻对:步长设为1,每次遍历当前索引和下一个索引的元素,确保所有相邻元素对都被计算。
- 动态更新计算值:每次循环中直接根据当前索引取值计算,避免变量固定不变的问题。
- 合理初始化最大值:用第一对相邻元素的乘积作为初始最大值,无论后续乘积是正还是负,都能正确比较出最大值。
- 添加返回值:补充
return highestProduct语句,确保函数能输出计算结果。
内容的提问来源于stack exchange,提问作者XboxOneSogie720
相关产品推荐
相关产品推荐

