问题描述
如何更改我的代码以获取每个元素的计数? 使用我的代码一切正常。它有效,但我如何只更改那部分?
#include <iostream>
#include <vector>
void countFreq(int arr[],int n)
{
// Mark all array elements as not visited
std::vector<bool> visited(n,false);
// Traverse through array elements and
// count frequencies
for (int i = 0; i < n; i++) {
// Skip this element if already processed
if (visited[i] == true)
continue;
// Count frequency
int count = 1;
for (int j = i + 1; j < n; j++) {
if (arr[i] == arr[j]) {
visited[j] = true;
count++;
}
}
std::cout<<count<<" ";
}
}
int main()
{
int n;
std::cin>>n;
int arr[n];
for(int i = 0; i < n; i++){
std::cin>>arr[i];
}
countFreq(arr,n);
return 0;
}
关于结果`
input 10
1 1 2 2 3 3 4 4 5 5
output 2 2 2 2 2
但我想得到
output 2 2 2 2 2 2 2 2 2 2
(对于每个元素)
解决方法
如果您知道输入数组中的最大元素是多少,则可以通过这种方式找到数字的频率。假设 m
是数组中的最大数量。
所以你必须创建一个大小为 m
的新数组。您可以简单地将它们关联为 m
存储桶。从 0 到 m。每个桶将保存输入数组中每个元素的计数。每个桶的索引将引用输入数组中的元素。如果我们知道数组的最大元素是多少,则时间复杂度为 O(1)。
你可以这样做:
std::vector<int> frequencey(std::vector<int>& nums){
auto max = *(std::max_element(nums.begin(),nums.end()));
std::vector<int> frequencies(max + 1,0);
for(int i = 0; i < nums.size(); ++i){
frequencies[nums[i]] +=1;
}
return frequencies;
}
,
您需要将结果保存到每个数字的数组中。然后当你找到任何处理过的数字时,从保存的数组中打印计数器。
#include <iostream>
#include <vector>
#include <unordered_map>
void countFreq(int arr[],int n)
{
// Mark all array elements as not visited
std::vector<bool> visited(n,false);
std::unordered_map<int,int> counter;
// Traverse through array elements and
// count frequencies
for (int i = 0; i < n; i++)
{
// Skip this element if already processed
if (visited[i] == true)
{
std::cout << counter[arr[i]] << " ";
continue;
}
// Count frequency
int count = 1;
for (int j = i + 1; j < n; j++)
{
if (arr[i] == arr[j])
{
visited[j] = true;
count++;
}
}
counter[arr[i]] = count;
std::cout<<count<<" ";
}
}
int main()
{
int n;
std::cin>>n;
int arr[n];
for(int i = 0; i < n; i++)
{
std::cin>>arr[i];
}
countFreq(arr,n);
return 0;
}
,
您的函数包含额外的代码,最终会让您感到困惑。 visited
变量本质上是不必要的。在 count
处启动 0
并且不对“当前”单元格设置特殊情况,您会发现一些非常简单的代码可以满足您的需求:
void countFreq(int arr[],int n)
{
// Traverse through array elements and
// count frequencies
for (int i = 0; i < n; i++) {
// Count frequency
int count = 0;
for (int j = 0; j < n; j++) {
if (arr[i] == arr[j]) {
count++;
}
}
std::cout << count << " ";
}
}
,
问题在于您丢弃了已经访问过的值。
一种可能性是在第一次访问该值时记住计数, 并记住第一个值出现的索引值,当一个值被第二次、第三次访问时......
#include <iostream>
#include <vector>
void countFreq(const std::vector<int>& arr) {
int n = arr.size();
// Mark all array elements as not visited
std::vector<int> mem_count(n,n);
// Traverse through array elements and
// count frequencies
for (int i = 0; i < n; i++) {
// Skip this element if already processed
if (mem_count[i] != n) {
std::cout << mem_count[mem_count[i]] << " ";
continue;
}
// Count frequency
int count = 1;
for (int j = i + 1; j < n; j++) {
if (arr[i] == arr[j]) {
mem_count[j] = i;
count++;
}
}
mem_count[i] = count;
std::cout << count << " ";
}
}
int main() {
int n;
std::cin>>n;
std::vector<int> arr(n);
for(int i = 0; i < n; i++){
std::cin >> arr[i];
}
countFreq(arr);
return 0;
}
,
这个很简单
#include <vector>
#include <map>
#include <iostream>
void main()
{
std::vector<int> v { 1,1,2,3,4,5,5 }; // Your input vector
// Count "frequencies"
std::map<int,int> m;
for (auto i : v)
m[i]++;
// Print output
for (auto i : v)
std::cout << m[i] << " ";
}