计算元素插入向量的次数

时间:2019-01-24 01:55:06

标签: c++

我实现了一个代码,该代码计算元素在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;
}

3 个答案:

答案 0 :(得分:1)

您的代码有几个问题。

  • cont从未设置回0

  • 如果向量中的重复项彼此不相邻,则说明您正在破坏

  • 如果最频繁的重复出现在开始处,则会被下一组重复覆盖

要解决这些问题,您需要一个maxCont和一个cont。在计算重复项时,将当前的contmaxCont进行比较,如果较大则将其替换。

答案 1 :(得分:0)

您尝试过的过程的复杂度为O(n ^ 2)。您可以在简化程序的同时提高效率:

1对向量(std::sort)进行排序:复杂度O(n logn)
2在排序的向量上循环以计算连续的重复项:复杂度O(n)

如评论中所述,如果允许,使用std::map将进一步简化程序,但复杂度仍为O(n logn)

答案 2 :(得分:0)

使用std::mapstd::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";

Demo