【问题标题】:How do I count the number of occurrences in an array?如何计算数组中出现的次数?
【发布时间】:2015-04-15 04:49:09
【问题描述】:

我生成了一个由 1-5 的 5 个随机整数组成的数组。这是数组现在的样子:myArray[5] = {3, 3, 1, 4, 5}

我现在已经按升序对包含 5 个整数的数组进行了排序,从最小到最大。

myArray[5] = {1, 3, 3, 4, 5}

我现在需要计算一个特定整数的出现次数并制作一个表格。

如:

Number: Count: 
1:1 
2:0 
3:3 
4:0 
5:1

我得到的最远的一直是遍历数组。我很难计算数字并计算发生的次数。

不使用任何地图或迭代等。我正在尝试获取此计数。这是我已经尝试过的:

int counts[10];

for (int x = 0; x <= 10; x++){
    int counter = 0;
    for (int j = 0; j < ARRAY_SIZE; j++){
        if (x == myArray[j]){
            counts[x] == counter++;
        }
    }

    cout << "Number: " << x << "Number of Occurances: " << counts[counter]<< "\n";
}

但是,我的输出非常错误。

【问题讨论】:

  • 制作一个计数数组。使用当前元素中的值作为该数组中的索引,并增加计数。顺便说一句,没有必要为此对数组进行排序。
  • 其实,既然是C++,你应该使用std::map
  • 嘿@Barmar 我仍然对这里的解决方案感兴趣。我已经尝试按照您的解释进行操作,但是我遇到了一些奇怪的行为。您能否详细说明此解决方案?
  • 如果你打算使用map来存储数字频率,你不必先对数组进行排序
  • 请将您尝试的解决方案添加到问题中。我还能如何告诉您您做错了什么,以便您从错误中吸取教训?

标签: c++ arrays loops


【解决方案1】:

使用std::map 将整数映射到它们的计数。

std::map<int, int> counts;
for (int i = 0; i < 5; i++) {
    counts[myArray[i]]++; // increment the counter for the current value
}

现在您可以打印counts 中的键和值。请参阅How to loop through a C++ map of maps? 了解如何执行此操作。

您可以使用数组而不是地图来做到这一点。唯一的区别是它不会自动扩展以处理更大的值(除非您使用mallocrealloc 使其动态调整大小)。

#define MAX_VALUE 9
int counts[MAX_VALUE+1] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
for (int i = 0; i < ARRAY_SIZE; i++) {
    if (myArray[i] <= MAX_VALUE) {
        counts[myArray[i]]++; // increment the counter for the current value
    }
}
for (int j = 0; j <= MAX_VALUE; j++) {
    cout << "Number: " << j << "Number of Occurances: " << counts[j] << endl;
}

【讨论】:

  • 在这个例子中,我如何循环遍历counts 并打印出键和值?
  • 我添加了一个链接,指向另一个可以回答这个问题的问题。
  • 我添加了一个使用数组而不是映射的代码版本。基本上是一样的,但是你要显式地初始化它,并且确保你没有超出数组的边界。
  • 你为什么用map而不是hash map?
  • std::map 很可能是使用哈希表来实现的。
【解决方案2】:

做一个哈希并用零初始化。

int hash[10000]={0};
for(int i=0;i<n;i++)
{  
     hash[arr[i]]++;
}

索引 arr[i] 处的哈希值将保存该数字的出现次数。因为hash[arr[i]]++ 将增加索引处的计数等于 arr[i] 的值。这样我们可以通过检查 hash[arr[i]] 来检查哪个值出现了多少次,其中 arr[i] 是要检查的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2021-03-22
    • 2022-01-06
    • 1970-01-01
    • 2017-03-24
    相关资源
    最近更新 更多