在数组中查找3个或更多重复项

时间:2019-11-15 15:15:43

标签: c++

我需要编写一个程序来检查数组中是否有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

1 个答案:

答案 0 :(得分:1)

您的代码存在的问题是:

您正在比较任意两个数字,并且永远不会重置计数器。因此,如果存在1 1,则您将增加计数器。如果那有一个2 2,那么您也在增加计数器。对于最后的3 3,您还增加了一个计数器。然后是3。尽管只有2个相同的值。这永远行不通。你能做的就是

  • 读取所有值
  • 计算每个不同值的频率
  • 检查值的频率
  • 如果任何计数大于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;
}

我希望这会让您对如何完成此操作有所了解。 。