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

关于Codility FrogRiverOne问题的题意解析及JS代码求助

再看看你的代码问题

你的思路方向是对的:用数组记录每个位置第一次出现的时间,这样能保证拿到的是每个位置最早的落叶子时间。但有几个小问题拖了后腿:

  1. 你用leaves.length <= X判断是否凑齐位置,这完全不对——JS的数组是稀疏结构,比如你给leaves[5]赋值后,数组长度会变成6,但前面的1-4可能都没值,这个判断根本起不到作用。
  2. 最后你要找的结果应该是1~X所有位置对应时间的最大值——因为只有当最后一个需要的叶子落下时,所有位置才都被覆盖,这个最大值就是最早的完成时间。
  3. 你的代码没写完(result = ...),而且可以优化:不用等到循环结束再检查,每记录一个新位置就计数,凑齐X个直接返回当前时间,效率更高。

修正后的完整代码

我给你调整后的代码,加了注释,你可以直接测试:

function solution(X, A) {
    // 用数组存每个位置第一次出现的时间,索引对应位置(1~X)
    const leaves = [];
    // 记录已经覆盖的位置数量,避免最后再循环检查
    let coveredPositions = 0;

    for (let i = 0; i < A.length; i++) {
        const currentPos = A[i];
        // 只处理1到X之间的位置,超出的不用管(比如示例里的5)
        if (currentPos >= 1 && currentPos <= X) {
            // 如果这个位置还没记录过时间
            if (typeof leaves[currentPos] === 'undefined') {
                leaves[currentPos] = i;
                coveredPositions++;
                // 提前判断:如果已经凑齐所有X个位置,直接返回当前时间
                if (coveredPositions === X) {
                    return i;
                }
            }
        }
    }

    // 循环结束还没返回,说明永远凑不齐所有位置,返回-1
    return -1;
}

// 测试你的示例
console.log(solution(4, [1, 3, 1, 4, 2, 3, 5, 4])); // 输出4,和预期一致

这个版本不仅修正了你的问题,还做了效率优化:提前终止循环,不用遍历整个数组,时间复杂度是O(N),完全符合Codility的性能要求。

内容的提问来源于stack exchange,提问作者smus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:04:38