PHP实现数组等和索引函数遇Codewars测试用例不通过求助
问题分析与修复
为什么索引6是正确结果?
根据题目要求:空数组的和视为0。对于数组[10,-80,10,10,15,35,20]的索引6(最后一个元素):
- 左侧元素是
[10,-80,10,10,15,35],求和为:10 + (-80) + 10 + 10 +15 +35 = 0 - 右侧无元素,和为0
两者相等,因此索引6是符合要求的正确结果。
你的代码存在的问题
- 跳过了索引0的检查:代码中
if ($key < 1) continue;直接跳过key=0的情况,导致无法处理索引0符合条件的场景。 - 索引逻辑偏移:循环中返回
$key - 1,相当于把当前循环的key对应到前一个索引,逻辑混乱,导致最后一个索引(6)根本没被正确检查。 - 数组切片错误:
- 计算左侧元素时,
array_slice($numbers, 0, $key - 1)的长度参数错误,无法正确取到当前索引的左侧所有元素。 - 计算右侧元素时,
array_slice($numbers, $key, count($numbers) - 1)的长度参数错误,会错误包含当前元素,而非仅右侧元素。
- 计算左侧元素时,
修复后的代码
function find_even_index(array $numbers): int { $totalCount = count($numbers); for ($n = 0; $n < $totalCount; $n++) { // 左侧元素:0到n-1 $leftSum = array_sum(array_slice($numbers, 0, $n)); // 右侧元素:n+1到末尾 $rightSum = array_sum(array_slice($numbers, $n + 1)); if ($leftSum === $rightSum) { return $n; } } return -1; }
优化建议(可选)
上述代码虽然正确,但多次调用array_sum和array_slice会有性能损耗,数组较大时更明显。可以通过预计算总和的方式优化:
function find_even_index(array $numbers): int { $totalSum = array_sum($numbers); $leftSum = 0; foreach ($numbers as $n => $num) { // 右侧和 = 总和 - 左侧和 - 当前元素 $rightSum = $totalSum - $leftSum - $num; if ($leftSum === $rightSum) { return $n; } $leftSum += $num; } return -1; }
这个版本仅计算一次总和,遍历过程中累加左侧和,右侧和通过总和推导得出,效率更高。
内容的提问来源于stack exchange,提问作者user5405648
相关产品推荐
相关产品推荐

