如何打印数组中的第三大元素?
How to print third largest element in an array?
我有两个测试用例,但只有一个给出了正确的输出。
第二个是给我数组的第一个元素。
请告诉我哪里出错了。
谢谢
#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
您的初始条件不正确。通过将所有 3 个最大值初始化为数组的第一个条目,您将遇到极端情况,其中数组其余部分的 none 将满足更改它们的条件。
例如,如果您的数组以最大值开头,那么 none 的条件将永远触发。发生这种情况是因为您的初始条件实际上对其余逻辑无效。
一种修复方法是将您的 3 个值设置为数组中前三个值的 排序 版本。另一种方法是将它们初始化为 numerical_limits<int>::min
(如评论中所建议的),对于小于 3 的数组,这只会有一个极端情况。另一种方法是跟踪每个值持有者的初始化状态并在之前检查比较。
当然,最好的答案是使用预先编写的原语。 @Jesper Juhl 明智地建议 std::nth_element
这将直接解决问题。
如果这是家庭作业,您可以尝试使用 std::set
之类的方法来存储 3 个最大值。您只需与第一个条目进行比较,如果较大则插入,然后擦除新的第一个条目以保持大小 == 3。
我有两个测试用例,但只有一个给出了正确的输出。 第二个是给我数组的第一个元素。 请告诉我哪里出错了。 谢谢
#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
您的初始条件不正确。通过将所有 3 个最大值初始化为数组的第一个条目,您将遇到极端情况,其中数组其余部分的 none 将满足更改它们的条件。
例如,如果您的数组以最大值开头,那么 none 的条件将永远触发。发生这种情况是因为您的初始条件实际上对其余逻辑无效。
一种修复方法是将您的 3 个值设置为数组中前三个值的 排序 版本。另一种方法是将它们初始化为 numerical_limits<int>::min
(如评论中所建议的),对于小于 3 的数组,这只会有一个极端情况。另一种方法是跟踪每个值持有者的初始化状态并在之前检查比较。
当然,最好的答案是使用预先编写的原语。 @Jesper Juhl 明智地建议 std::nth_element
这将直接解决问题。
如果这是家庭作业,您可以尝试使用 std::set
之类的方法来存储 3 个最大值。您只需与第一个条目进行比较,如果较大则插入,然后擦除新的第一个条目以保持大小 == 3。