gpt4 book ai didi

c++ - 查找数组中出现次数最多的元素

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:53:46 26 4
gpt4 key购买 nike

这是一个简单的程序,用于查找数组中最常出现的元素:

#include <cstdlib>
#include <iostream>
#include <vector>

using namespace std;

int main(int argc, char *argv[]) {
int a[] = {1,2,3,4,4,4,5};
int n = sizeof(a) / sizeof(int);
int max = 0;
int result = 0;
int *b = new int[n];
for (int i = 0; i < n; i++) {
b[a[i]] = (b[a[i]] || 0) + 1;
if (b[a[i]] > max) {
max = b[a[i]];
result = a[i];
}
}
cout << result << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

但它不起作用;它打印 1。为什么?

最佳答案

既然你无论如何都包括 vector ,为什么不替换 int *b=new int [n];std::vector<int> b(n) ?这也负责释放内存,你忘了 delete[] b .

但正如其他人所提到的,如果数组包含大于 n 的元素,您的解决方案将会失败。更好的方法可能是计算映射到 int 的元素。这样,您还可以计算不能用作数组索引的元素,例如字符串。

我们也没有理由将自己局限于数组。这是一个通用解决方案,适用于任何低于可比元素类型的任何容器:

#include <algorithm>
#include <iterator>
#include <map>

struct by_second
{
template <typename Pair>
bool operator()(const Pair& a, const Pair& b)
{
return a.second < b.second;
}
};


template <typename Fwd>
typename std::map<typename std::iterator_traits<Fwd>::value_type, int>::value_type
most_frequent_element(Fwd begin, Fwd end)
{
std::map<typename std::iterator_traits<Fwd>::value_type, int> count;

for (Fwd it = begin; it != end; ++it)
++count[*it];

return *std::max_element(count.begin(), count.end(), by_second());
}

#include <iostream>
#include <vector>

int main()
{
std::vector<int> test {1, 2, 3, 4, 4, 4, 5};
std::pair<int, int> x = most_frequent_element(test.begin(), test.end());
std::cout << x.first << " occured " << x.second << " times";
}

关于c++ - 查找数组中出现次数最多的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3798261/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com