如何打印数组中的第三大元素?

时间:2019-08-21 17:19:29

标签: c++ structure

我有两个测试用例,但是只有一个能给我正确的输出。 第二个是给我数组的第一个元素。 请告诉我我要去哪里错了。 谢谢。

#include <iostream>
using namespace std;

void thirdLargest(int arr[], int arr_size)
{
  int m1 = arr[0], m2 = arr[0], m3 = arr[0], i;

  for(i = 0; i < arr_size; i++)
  {
    if(m1 < arr[i])
    {
      m3 = m2;
      m2 = m1;
      m1 = arr[i];
    }
    else if(m2 < arr[i])
    {
      m3 = m2;
      m2 = arr[i];
    }
    else if(m3 < arr[i])
    {
      m3 = arr[i];
    }
  }

  cout << "The third Largest element is " << m3;
}

int main() {
  int n;
  cin >> n;
  int a[n];

  for(int i = 0; i < n; i++)
  {
    cin >> a[i];
  }

  thirdLargest(a, n);

  return 0;
}

测试用例:

TEST CASE 1 

INPUT
6
1 14 2 16 10 20
OUTPUT
The third Largest element is 14

TEST CASE 2 

INPUT
7
19 -10 20 14 2 16 10
OUTPUT
The third Largest element is 16

1 个答案:

答案 0 :(得分:3)

您的初始条件不正确。通过将所有3个最大值初始化为数组的第一个条目开始,您将遇到极端情况,在该情况下,数组的其余部分都不满足更改条件。

例如,如果您的数组以max开头,则不会触发任何条件。发生这种情况是因为您的初始条件实际上对其余逻辑无效。

一种解决方法是将3个值设置为数组中前三个值的排序版本。另一种方法是将它们初始化为numerical_limits<int>::min(如注释中所建议),这对于小于3的数组仅具有特殊情况。另一种方法是跟踪每个值持有者的初始化状态并在比较。

当然,最好的答案是使用预写的原语。 @Jesper Juhl明智地建议使用std::nth_element,它将直接解决问题。

如果这是一项家庭作业,则可以尝试使用std::set之类的东西来存储3个最大值。您只需要与第一个条目进行比较,如果比较大则插入,然后擦除新的第一个条目以保持大小== 3。