首页 > 解决方案 > 为什么我的代码说 90 重复了 6 次,而不是 5 次?

问题描述

我正在研究的问题是来自 HackerRank 的“生日蛋糕蜡烛”。

基本上,程序接受输入,然后输出最大输入的输入次数。

例如,如果输入可能是:

4

3 2 1 3

4 将是数组中的元素数。3 2 1 3 将是数组中的元素。

输出为 2,因为 3(最大)重复 2 次。

这是我的代码:

#include <iostream>

using namespace std;

int main() {
    
    long long num;
    cin >> num;
    
    long long arr[num];
    
    for (int i = 0; i < num; i++) {
        cin >> arr[i];
    }
    
    long long qwer{};
    
    //find the largest value
    for (int i = 1; i<num; i++) {
        if (arr[0] < arr[i]) {
            arr[0] = arr[i];
            if (arr[0] == arr[i]) {
                arr[0] = arr[i];
            }
        }
        qwer = arr[0];
    }

    
    long long howmany = 0;
    
    //find how many times the largest value is repeated
    for (int i = 0; i<num; i++) {
        if (arr[i] == qwer) {
            howmany += 1;
        }
    }
    
    cout << howmany;
    
    return 0;
}

我的代码为上述测试用例提供了正确的输出。但是,对于以下测试用例,输出不正确:

10

18 90 90 13 90 75 90 8 90 43

对于这个测试用例,我的程序输出了 6,而不是 5。

10

44 53 31 27 77 60 66 77 26 36

对于这个测试用例,我的程序输出 3,而不是 2。

我的代码有什么问题?

提前致谢。

标签: c++algorithmloopsfor-loopmax

解决方案


您的代码的问题是您的“查找最大值”循环将数组的第一个元素替换为找到的最大值。当您在“查找多少次”循环中循环返回数组时,您有一个额外的高值实例,因此返回 6 而不是 5。

输入时的数组:18 90 90 13 90 75 90 8 90 43

在“查找最大值”循环完成后您的数组: 90 90 90 13 90 75 90 8 90 43

这对您的第一个示例起作用的原因是因为最高值是第一个元素。因此,您不会用任何东西替换第一个元素并在数组中创建额外的实例。如果您首先尝试一个具有最高值的 10 的数组,您将得到正确的数字输出。

此外,您可以将循环更改为:

    qwer = arr[0];

    //find the largest value
    for (int i = 1; i<num; i++) {
        if (qwer < arr[i]) {
            qwer = arr[i];
        }
    }

这将消除您所看到的示例之间不一致的问题。


推荐阅读