You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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是符合要求的正确结果。

你的代码存在的问题

  1. 跳过了索引0的检查:代码中if ($key < 1) continue;直接跳过key=0的情况,导致无法处理索引0符合条件的场景。
  2. 索引逻辑偏移:循环中返回$key - 1,相当于把当前循环的key对应到前一个索引,逻辑混乱,导致最后一个索引(6)根本没被正确检查。
  3. 数组切片错误:
    • 计算左侧元素时,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:25:36