【问题标题】:Why this code works for 8 different test cases except 1 in C++?为什么这段代码适用于 8 个不同的测试用例,除了 C++ 中的 1 个?
【发布时间】:2020-04-09 07:46:34
【问题描述】:

所以我用 C++ 编写了这个函数,它基本上计算数组中的最大数,然后打印出数组中的最大数。函数代码如下:

int Number_of_maxNum(vector<int> ar) {
      int max=0;
      int Number_of_Maxnum=0;
      int d = ar.size();

      for(int i=0;i<=d;i++){
          if(ar[i]>max){
          max=ar[i];
          }
      }

      for(int j=0;j<=d;j++){
          if(ar[j]==max){
             Number_of_Maxnum++;
          }
      }

      return Number_of_Maxnum;

}

现在,此代码不适用于以下数组作为输入: {44、53、31、27、77、60、66、77、26、36} 它应该打印出 2,但打印出 1

如果有人可以解释一下输入 1 作为输入的实际情况,它会

【问题讨论】:

  • 如果当前答案是正确的,请检查它是否为正确答案。 ;-)
  • 我认为这是因为你给 for 循环的大小。您应该将其设为j&lt;d,因为数组包含 0-n-1 的空格。可能发生的情况是你得到一个比所有数字都大的垃圾值,因此你得到 1。

标签: c++ function for-loop if-statement


【解决方案1】:

您有未定义的行为。数组/向量的索引从0Size-1。所以将i&lt;=d 更改为i&lt;d。这很可能是这个奇怪结果的原因。因为您在其边界之外读取向量,导致(有效地)随机最后一个值(注意这是 UB,它甚至可能使您的整个程序崩溃)。

另一件事是你应该初始化int max = std::numeric_limits&lt;int&gt;::min();,除非你保证ar的所有元素都是非负的。

最后,您可以在一个循环中完成整个处理。试试这个:

int Number_of_maxNum(const vector<int>& ar)  // <--- do this to avoid vector copy
{
      int currentMax = std::numeric_limits<int>::min();
      int counter = 0;
      for (int value : ar)  // <--- do this to avoid error prone manual indexing
      {
          if (value == currentMax)
          {
              counter++;
          }
          else if (value > currentMax)
          {
              currentMax = value;
              counter = 1;
          }
      }
      return counter;
}

【讨论】:

  • 他是初学者,你的代码可能对他来说太复杂了。 :)
  • @Apitronix 这就是为什么我在第一段中给了他快速简单的修复,而后来是正确的解决方案。志存高远,我的朋友,从不放低。 :)
【解决方案2】:

接受的答案肯定是正确的,并解释了您的代码错误的原因。

不过,你也应该考虑使用 STL 来做你需要的事情,像这样

int Number_of_maxNum(const std::vector<int>& ar)  
{
  if (ar.size() == 0)
    return 0;

  auto max = *std::max_element(ar.cbegin(), ar.cend());

  return std::count(ar.cbegin(), ar.cend(), max);
}

其中一些优点是:

  1. 它更易于阅读(一旦您习惯了,也更容易书写)。
  2. 不存在非一错误的问题(正如您在解决方案中遇到的那样)。
  3. 不必担心将最大数字初始化为可能的最小数字。

此解决方案的一个缺点是它会在向量上循环两次。这仍然可以通过使用适当的算法来避免,例如

int Number_of_maxNum(const std::vector<int>& ar)  
{
  return std::accumulate(ar.cbegin(), ar.cend(), 0, 
          [max = std::numeric_limits<int>::min()]  
          (int count, int num) mutable {
             return num > max ? max = num, 1 : count + (num == max);
  });
}

这实际上是传统的 for 循环,所以我不确定通过这种方式编写它有什么好处。此外,可变 lambda 可以被视为代码异味。一旦您了解了这些选项,您应该根据自己的判断来决定使用哪种技术。

【讨论】:

  • 一个缺点:你在向量上循环了两次。
  • @freakish 这是真的。我已经更新了答案以反映这一点。
猜你喜欢
  • 2020-12-26
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 2022-01-22
  • 2019-11-20
  • 2012-09-21
相关资源
最近更新 更多