c++ 在数组中找到3个或更多重复项

rxztt3cl  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(107)

我需要写一个程序,检查是否有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
hmae6n7t

hmae6n7t1#

您的代码存在的问题是:
您正在比较任意两个数字,并且永远不会重置计数器。所以如果有11,你就在增加计数器。如果有一个2,你也在增加计数器。最后的3个3你也增加了相同的计数器。那就是3。虽然只有两个相同的值。这行不通的。你能做的是

  • 读取所有值
  • 计算每个不同值的频率
  • 检查值的频率是否
  • 如果任何计数大于2,则显示相应的消息
  • 显示每个值的计数

我将向您展示“更现代”的C方法,并将使用C算法来实现下面的示例解决方案。
首先,我们将从用户那里获得要处理的值的数量。我们将这些值存储在std::vector中。然后,我们使用std::copy_n将值从std::cin复制到std::vector。为此,我们将使用std::istream_iterator来迭代用户给定的元素。因此,我们使用一个简单的单行程序读取用户的所有值。
接下来是频率计数。为此,我们有一个标准的C解决方案。你会在网上的几十个地方找到它。我们将使用std::map。键是我们读入向量的整数,值是计数器。使用std::map的索引操作符[],我们向Map添加一个值,如果它还不存在。使用,我们只需进行计数,无论值已经在std::map中还是刚刚添加。这也是一个非常简单的单行线。
然后,我们检查是否有任何计数大于2。为此,我们将使用STL算法std::any_of和一个非常简单的lambda。有了它,我们就能创造出你想要的结果。
最后但并非最不重要的是,如果计数大于2,我们将显示所有值及其计数。这是我们用一个超简单的基于range的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;
}

我希望这能给你一个如何做到这一点的想法。……

相关问题