我正在尝试编写一个程序来检查数组的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"
。
答案 0 :(得分:1)
您可以使用以下算法:首先对数组进行排序。然后迭代每个相邻的对。如果它们相等,则增加计数器,如果不相等,则将计数器重置为1。如果计数器为3,则返回true。如果循环未返回true,则返回false。
答案 1 :(得分:0)
在外部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个相等的元素。
答案 2 :(得分:0)
每次将skirt
增加到小于3时,将i
重置为0,否则将break
重置为循环。
答案 3 :(得分:0)
执行此操作的另一种方法是使用std::map
,它可以计算给定值在数组中出现的次数。一旦您的数字出现了3次,您就会停止寻找。
这是“极简”代码版本:
#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;
}
我并不是说这比其他答案更好(或更糟),这只是解决问题的另一种方式,并且可以利用标准库提供的功能。另外,使用这种方法,您可以轻松地修改代码以计算3次或3次以上或任意次数出现的数字。
随时要求进一步的澄清和/或解释。