字符串数组中出现次数最多的元素
Element with highest occurence in array of strings
我需要找到字符串数组中出现次数最多的元素。我不知道该怎么办,因为我对此没有太多经验。我不知道指针/哈希表。
我已经为整数做了这件事,但我不能为字符串做这件事。
我的版本:
#include <iostream>
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 *b=new int [n];
fill_n(b,n,0); // Put n times 0 in b
int val=0; // Value that is the most frequent
for (int i=0;i<n;i++)
if( ++b[a[i]] >= b[val])
val = a[i];
cout<<val<<endl;
delete[] b;
return 0;
}
感谢您在字符串数组中查找最频繁出现的元素!
首先,考虑使用类似向量的C++容器,而不是普通数组。(如果需要,可以搜索"数组到矢量"或类似的内容在它们之间转换。(
然后,如果你可以使用C++11,你可以做这样的事情(如果没有C++11,它会变得有点长,但仍然可行(:
std::string most_occurred(const std::vector<std::string> &vec) {
std::map<std::string,unsigned long> str_map;
for (const auto &str : vec)
++str_map[str];
typedef decltype(std::pair<std::string,unsigned long>()) pair_type;
auto comp = [](const pair_type &pair1, const pair_type &pair2) -> bool {
return pair1.second < pair2.second; };
return std::max_element(str_map.cbegin(), str_map.cend(), comp)->first;
}
这是一个与旧版C++兼容的版本
bool comp(const std::pair<std::string,unsigned long> &pair1,
const std::pair<std::string,unsigned long> &pair2) {
return pair1.second < pair2.second;
}
std::string most_occurred(const std::vector<std::string> &vec) {
std::map<std::string,unsigned long> str_map;
for (std::vector<std::string>::const_iterator it = vec.begin();
it != vec.end(); ++it)
++str_map[*it];
return std::max_element(str_map.begin(), str_map.end(), comp)->first;
}
您可以考虑使用字符串向量并使用映射来计数出现次数:
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main(int argc, char *argv[])
{
vector<string> a;
map<string, int> m;
// fill a with strings
a.push_back("a");
a.push_back("b");
a.push_back("b");
a.push_back("c");
a.push_back("c");
a.push_back("c");
a.push_back("d");
a.push_back("e");
// count occurrences of every string
for (int i = 0; i < a.size(); i++)
{
map<string, int>::iterator it = m.find(a[i]);
if (it == m.end())
m.insert(pair<string, int>(a[i], 1));
else
m[a[i]] += 1;
}
// find the max
map<string, int>::iterator it = m.begin();
for (map<string, int>::iterator it2 = m.begin(); it2 != m.end(); ++it2)
{
if (it2 -> second > it -> second)
it = it2;
}
cout << it -> first << endl;
return 0;
}
就优雅和效率而言,这个解决方案可能不是最好的,但它应该给出这个想法。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 如何将元素添加到数组的线程安全函数?
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 输出没有重复元素的动态数组(收缩数组)C++
- 数组中最大的非重复元素
- 数组元素打印的递归方法
- 对字符数组中的元素执行逐位操作
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 如何计算数组中元素的位数?(不是数组的长度),并计算其数字的总和
- 通过交换元素使数组相同
- 按平均值替换数组中的元素
- 打印矢量数组中的所有元素
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 如何为 c++ 的不同变量类型的结构元素创建动态数组?
- 如何将元素从向量转移到新数组?
- 如何在向量数组中插入元素?
- 为什么 2 个相同数组的元素彼此相等
- C++ 中的二维整数数组,每行中的元素数量不均匀