如何检查数组的 3 个元素是否具有相同的值

How to check if 3 elements of array have the same value

本文关键字:是否 元素 何检查 检查 数组      更新时间:2023-10-16

我正在尝试编写一个程序来检查数组的 3 个(或更多)元素是否相同。

我写了一个几乎完美的代码,但是当有 3 对相等的元素并且我不确定如何修复它时,它就会卡住。

#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n, a[10],skirt=0;
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> a[i];
}
for(int i = 0; i < n; i++)
{
for(int j = i + 1; j < n; j++)
{
if(a[i] == a[j])
{
skirt++;
}
}
}
cout<<skirt<<endl;
if(skirt>=3)
{
cout << "TAIP" << endl;
}
else
{
cout << "NE" << endl;
}
}

当我输入时

6 
3 3 2 2 1 1 i 

得到"TAIP"但我需要得到"NE".

您可以使用以下算法:首先对数组进行排序。然后迭代每个相邻的对。如果它们相等,则递增计数器,如果不是,则将计数器重置为 1。如果计数器为 3,则返回 true。如果循环不返回 true,则返回 false。

在外部 for 循环中添加以下条件

for(int i = 0; i < n - 2 && skirt != 3; i++)
^^^^^^^^^^^^^^^^^^^^^^^
{
skirt = 1;
^^^^^^^^^
for(int j = i + 1; j < n; j++)
{
if(a[i] == a[j])
{
skirt++;
}
}
}

当然,在循环之前,您应该检查n是否不小于3。例如

if ( not ( n < 3 ) )
{ 
for(int i = 0; i < n - 2 && skirt != 3; i++)
{
skirt = 1;
for(int j = i + 1; j < n; j++)
{
if(a[i] == a[j])
{
skirt++;
}
}
}
}

这是一个演示程序

#include <iostream>
using namespace std;
int main() 
{
int a[] = { 6, 3, 3, 2, 2, 1, 1 };
int n = 7;
int skirt = 0;
if ( not ( n < 3 ) )
{ 
for(int i = 0; i < n - 2 && skirt != 3; i++)
{
skirt = 1;
for(int j = i + 1; j < n; j++)
{
if ( a[i] == a[j] )
{
skirt++;
}
}               
}
}
cout << skirt << endl;
if ( skirt == 3 )
{
cout << "TAIP" << endl;
}
else
{
cout << "NE" << endl;
}
return 0;
}

它的输出是

1
NE

因为数组没有 3 个相等的元素。

如果小于3,则每次增加i时将skirt重置为 0,否则break出循环。

另一种方法是使用std::map,它保留给定值在数组中出现的次数。一旦你有一个有三次出现的数字,你就会停止查找。

这是一个"极简主义"代码版本:

#include <iostream>
#include <map>
using std::cin;  // Many folks (especially here on SO) don't like using the all-embracing
using std::cout; // ... statement, "using namespace std;".   So, these 3 lines only 'use'
using std::endl; // ... what you actually need to!
int main() {
int n, a[10], skirt = 0;
std::map<int, int> gots;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
for (int i = 0; i < n && skirt < 3; i++) {
skirt = 1;
if (gots.find(a[i]) != gots.end()) skirt = gots[a[i]] + 1;
gots.insert_or_assign(a[i], skirt);
}
cout << (skirt >= 3 ? "TAIP" : "NE") << endl;
return 0;
}

我并不是说这比其他答案更好(或更差) - 只是解决问题的另一种方式,并利用标准库所提供的功能。此外,使用此方法,您可以轻松修改代码以计算出现三次或更多次的数字数,或任何时间数。

请随时要求进一步澄清和/或解释。

相关文章: