首页 > 解决方案 > 返回预期的输出但仍然错误?

问题描述

假设我正在尝试解决这个问题:

https://www.hackerrank.com/challenges/break-best-and-worst-records/problem

我写了这段代码:

function breakingRecords(arr) {
    let n = arr.length;
    let best = 0;
    let worst = 100000000; // 10^8 (constraints :. cannot get higher)
    let rec1 = 0; // times broken best
    let rec2 = 0; // times broken worst
    for (let i = 0; i < n; i++) {
        if (arr[i] > best) {
            best = arr[i];
            if (i != 0) {
                rec1++;
            }
        } else if (arr[i] < worst) {
            if (i != 0) {
                worst = arr[i];
                rec2++;
            }
        }
    }
    return [rec2, rec1];
}

//And for one test case, I say:

console.log(breakingRecords([3, 4, 21, 36, 10, 28, 35, 5, 24, 42]))

输出为[4, 2],等于预期输出(预期输出为4 2,但它们自己添加了空格)。但是,当我输入此代码时,我的输出显示为4 0. 我在浏览器中测试它,我仍然得到[4, 2].

输出截图

有人可以解释为什么会这样,我能做些什么来解决它?刷新不起作用,关闭和重新打开也不起作用。

标签: javascriptarrays

解决方案


实际上,您的代码是错误的。预期的结果是4 0,但您的代码返回4 2

那是因为第一次迭代。第一场比赛的结果是当前最好和最差的,但不计入分数。您的代码仅将其设置为最好的分数(因为else if),而不是最差的。

因此,让我们将其视为一种特殊情况,以及shift数组中的第一个元素(我们可以安全地做到这一点,作为数组必须包含至少一个元素的约束列表):

function breakingRecords(arr) {
    let best;
    let worst;
    best = worst = arr.shift() //Get and remove the first element
    let n = arr.length;
    let recBest = 0;  //Use more descriptive names here
    let recWorst = 0; //...and here as well
    for (let i = 0; i < n; i++) {
        if (arr[i] > best) {
            best = arr[i];
            recBest++;
        } else if (arr[i] < worst) {
            worst = arr[i];
            recWorst++;
        }
    }
    return [recBest, recWorst];
}

//And for one test case, I say:

console.log(breakingRecords([3, 4, 21, 36, 10, 28, 35, 5, 24, 42])) //[4, 0]


推荐阅读