我实现了一个代码,该代码计算元素在N范围内插入向量的次数,然后打印出现次数最多的次数和出现次数。但是我的帐户总是返回奇怪的值。例如,如果我四次输入数字“ 123”,则续返回“ 6”。我看不到错误
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N,cont, i, j, elem,a;
vector<int> voto;
cin >> N;
cout << "Enter the values of the vector: "<< endl;
while(N!=0) {
cin >> elem;
voto.push_back(elem);
N--;
}
cont = 0;
int s = voto.size();
for(i = 0; i < s; i++){
for(j = i + 1; j< s; j++) {
if(voto[j] == voto[i])
cont++;
else
break;
a = voto[i];
}
}
cout << "The most voted was" << a << "with"<<cont<<"vote";
return 0;
}
答案 0 :(得分:1)
您的代码有几个问题。
cont
从未设置回0
如果向量中的重复项彼此不相邻,则说明您正在破坏
如果最频繁的重复出现在开始处,则会被下一组重复覆盖
要解决这些问题,您需要一个maxCont
和一个cont
。在计算重复项时,将当前的cont
与maxCont
进行比较,如果较大则将其替换。
答案 1 :(得分:0)
您尝试过的过程的复杂度为O(n ^ 2)。您可以在简化程序的同时提高效率:
1对向量(std::sort
)进行排序:复杂度O(n logn)
2在排序的向量上循环以计算连续的重复项:复杂度O(n)
如评论中所述,如果允许,使用std::map
将进一步简化程序,但复杂度仍为O(n logn)
答案 2 :(得分:0)
使用std::map
和std::max_element
,您可以执行以下操作:
int N;
std::map<int, std::size_t> m;
std::cin >> N;
std::cout << "Enter the values of the vector: "<< std::endl;
while (N != 0) {
int elem;
std::cin >> elem;
++m[elem];
N--;
}
auto it = std::max_element(m.begin(), m.end(),
[](const auto& lhs, const auto& rhs){
return lhs.second < rhs.second;
});
std::cout << "The most voted was " << it->first << " with " << it->second << " votes";