如何检查数组的 3 个元素是否具有相同的值
How to check if 3 elements of array have the same value
我正在尝试编写一个程序来检查数组的 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;
}
我并不是说这比其他答案更好(或更差) - 只是解决问题的另一种方式,并利用标准库所提供的功能。此外,使用此方法,您可以轻松修改代码以计算出现三次或更多次的数字数,或任何时间数。
请随时要求进一步澄清和/或解释。
相关文章:
- 是否可以在c++中处理字符串流中的各个元素
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 是否可以使用 new 指定具有宏常量的动态分配数组的元素?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 如何知道地图中的最后一个元素是否被删除?
- 检查 TinyXML 中的元素是否存在
- 经过最后一个数组元素末尾的指针是否应该等于超过整个数组末尾的指针?
- 是否需要 mutex() 来安全地同时访问具有 2 个线程的数组的不同元素?
- 是否有用于元素部分移位的 simd 指令/内在/内置指令?
- 是否有具有外部元素分配的序列容器(在 STL 中)?
- C++:是否可以编写一个函数,将不同类型的元素附加到变体数组中?
- 数组对象的生存期是否在重用其元素存储时结束?
- 擦除是否删除 stl 无序列图元素使用的堆内存
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 是否可以使用宏来访问动态数组或向量中的元素或为其赋值
- 如果我在相应 char 数组的声明中为其提供额外的元素,是否会自动设置 NULL?
- 使用 at() 访问 std::map 元素是否比运算符 [] 慢?