繁体   English   中英

为什么我的代码说 90 重复了 6 次,而不是 5 次?

[英]Why does my code say that 90 was repeated 6 times, instead of 5?

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

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

例如,如果输入可能是:

4

3 2 1 3

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

output 将是 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;
}

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

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。

我的代码有什么问题?

提前致谢。

您的代码的问题是您的“查找最大值”循环将数组的第一个元素替换为找到的最大值。 当您在“查找多少次”循环中循环返回数组时,您有一个额外的高值实例,因此返回 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];
        }
    }

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

有很多更好的方法可以做到这一点,就像这里的另一个答案一样。

但专注于回答你的问题:

我认为您的错误是将最大数字存储在阵列的第一个 position 中。

if (arr[0] < arr[i]) {
            arr[0] = arr[i];

看这个案例测试:10

18 90 90 13 90 75 90 8 90 43

在这里,您将第一个项目 18 替换为 90。因此,您在最后一个循环中得到了 6 而不是 5。

您可以尝试用下面的代码替换上面注释的代码吗?

if (arr[0] < arr[i]) {
            qwer  = arr[i];

停止浪费 memory。 您不需要存储所有值。 读取输入。 检查它是当前的最大数量还是新的最大数量。 更改count

#include <iostream>
#include <limits>

int main() {
    
    std::int64_t num;
    std::cin >> num;
    
    std::int64_t count = 0;
    std::int64_t maxNumber = std::numeric_limits<std::int64_t>::min();
    
    for (std::int64_t i = 0; i < num; i++) {
        std::int64_t input;
        std::cin >> input;
        if (input > maxNumber) {
            maxNumber = input;
            count = 1;
        } else if (input == maxNumber) {
            ++count;
        }
    }
    
    std::cout << count;
}

这是一个运行最大值的示例,不使用 arrays:

int total = 0;
std::cin >> total;
int maxima;
int count = 1;
std::cin >> maxima; // Use first value as the maxima.
--total;
for (int i = 0; i < total; ++i)
{
  int value;
  std::cin >> value;
  if (value == maxima)
  {
    ++count;
  }
  else
  {
    if (value > maxima)
    {
      maxima = value;
      count = 1;
    }
  }
}
std::cout << "Largest value: " << maxima << ", quantity: " << count << std::endl;

上面的代码维护了最大值和最大值的出现次数。 如果读取了新的最大值,则计数重置为 1。

对于初学者可变长度 arrays

long long num;
cin >> num;

long long arr[num];
//...

不是标准的 C++ 功能。

其次,对于这个任务,不需要创建一个数组来存储输入的值,因为您需要计算遇到最大值的频率。 此外,创建具有自动存储持续时间的大数组可能会导致堆栈溢出。

在这个 for 循环中

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];
}

这个 if 语句

        if (arr[0] == arr[i]) {
            arr[0] = arr[i];
        }

是多余的,实际上什么也没做。

请注意,元素 arr[0] 被当前最大值覆盖,尽管最初它可能不包含这样的值。

在这个 for 循环中

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

您可以再计算一个具有最大值的元素,因为元素 arr[0] 被设置为等于最大值并且它被计算在内。

仅使用一个循环,程序看起来就更简单了。

给你。

#include <iostream>

int main() 
{
    size_t n = 0;
    
    std::cin >> n;
    
    size_t howmany = 0;
    long long int max;
    long long int value;
    
    for ( size_t i = 0; i < n && std::cin >> value; i++ )
    {
        
        if ( i == 0 || max < value )
        {
            max = value;
            howmany = 1;
        }
        else if ( not ( value  < max ) )
        {
            ++howmany;
        }
    }
    
    std::cout << howmany << '\n';
    
    return 0;
}

如果进入序列

10
18 90 90 13 90 75 90 8 90 43

那么 output 将是

5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM