我需要编写一个程序来检查数组中是否有3个或更多匹配数字。我的代码可以正常工作,直到有一个类似“ 2 2 3 3 5 5 4 4 1 1”的数组,然后它批准该数组中存在3个或更多重复项,这是不正确的。也许有人知道一个对我有帮助的简单解决方案?还是我需要覆盖我的代码? 这是我的代码:
#include <iostream>
using namespace std;
void funk(int n, int a[], int &kiek);
int main()
{
int n, a[101],kiek=0;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
funk(n, a, kiek);
if (kiek > 2) {
cout << "TAIP";
}
else
cout << "NE";
}
void funk(int n, int a[], int &kiek)//funkcijos kūnas
{
int j;
for (int i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
if (a[i] == a[j])
kiek++;
cout << kiek;
}
}
}
这是输入:
10
2 2 3 3 5 5 4 4 1 1
这是我需要获得的输出:
NE
答案 0 :(得分:1)
您的代码存在的问题是:
您正在比较任意两个数字,并且永远不会重置计数器。因此,如果存在1 1,则您将增加计数器。如果那有一个2 2,那么您也在增加计数器。对于最后的3 3,您还增加了一个计数器。然后是3。尽管只有2个相同的值。这永远行不通。你能做的就是
我将向您展示“更现代的” C ++方法,并将在下面的示例解决方案中使用C ++算法。
首先,我们将从用户那里获取要使用的值的数量。我们将值存储在std::vector
中。并且,我们使用std::copy_n
将值从std::cin
复制到我们的std::vector
。为此,我们将使用std::istream_iterator
来迭代用户给定的元素。因此,我们使用简单的单行代码从用户读取所有值。
接下来是频率计数。为此,我们有一个C ++标准解决方案。您会在网上的数十个地方找到它。我们将使用std::map
。密钥是我们读入向量的整数,而值是计数器。使用std::map
的索引运算符[]
,我们可以向地图添加一个值(如果尚不存在)。使用++,我们可以简单地进行计数,无论该值是已经在std::map
中还是刚刚被添加。这也是一个非常简单的单行代码。
然后,我们检查是否有任何计数大于2。为此,我们将使用带有非常简单的lambda的STL算法std::any:of
。这样,我们可以创建您想要的结果。
最后但并非最不重要的一点是,如果计数大于2,我们将显示所有值及其计数。这是基于超简单范围的for循环来完成的。我们使用结构化绑定从计数器std::map
中提取值。
请参阅:
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <iterator>
int main() {
// Give instructions
std::cout << "How many values do you want do read? Please specify: ";
// Read the number of values to enter
size_t numberOfValues{ 0U }; std::cin >> numberOfValues;
// Read the given number of values from std::cin
std::vector <int> values(numberOfValues);
std::copy_n(std::istream_iterator<int>(std::cin), numberOfValues, values.begin());
// Count each value
std::map<int, size_t> counter{};
std::for_each(values.begin(), values.end(), [&counter](const int& i) { counter[i]++; });
// Check, if any count is bigger than 2
if (std::any_of(counter.begin(), counter.end(), [](const std::pair<int, size_t> & c) { return c.second > 2; }))
std::cout << "TAIP\n";
else
std::cout << "NE\n";
// Look, if there is any number with a count bigger than 2 and show the result
for (const auto& [value, count] : counter)
if (count > 2) std::cout << value << " --> " << count << "\n";
return 0;
}
我希望这会让您对如何完成此操作有所了解。 。