统计数组中每个元素出现的个数,时间复杂度 O(n),空间 O(1)

本文介绍了一个使用C++实现的数组操作算法,该算法通过重新排列数组中的元素并标记重复出现的数字,最终输出所有重复数字及其出现次数。此算法采用了一个独特的策略来确保每个数字仅被标记一次。
部署运行你感兴趣的模型镜像

代码如下:

#include <iostream>
using namespace std;

void work(int a[], int n)
{
    int i = 0;
    while(i < n)
    {
        int temp = a[i] - 1;
        if(temp < 0)
        {
            i++;
            continue;
        }
        if(a[temp] > 0)
        {
            a[i] = a[temp];
            a[temp] = -1;
        }
        else
        {
            a[temp]--;
            a[i] = 0;
        }
    }
}

int main()
{
    int n = 10;
        int *a = new int[n];
        for(int i = 0; i < n; i++)
            cin >> a[i];
        work(a, n);
        for(int i = 0; i < n; i++)
            if(a[i] < 0)
                cout << i + 1 << " " << (-a[i]) << endl;
        cout << "********************" << endl;
        delete[] a;
    
    return 0;
}


您可能感兴趣的与本文相关的镜像

Qwen-Image

Qwen-Image

图片生成
Qwen

Qwen-Image是阿里云通义千问团队于2025年8月发布的亿参数图像生成基础模型,其最大亮点是强大的复杂文本渲染和精确图像编辑能力,能够生成包含多行、段落级中英文文本的高保真图像

在 C++ STL 中,可以通过使用 `std::map` 或 `std::unordered_map` 来统计数组每个元素现的次数。这种方法利用了映射容器的键值对特性,其中键存储数组中的元素,值记录该元素现的次数。 具体实现如下: ```cpp #include <iostream> #include <map> using namespace std; int main() { int a[] = {1, 2, 3, 4, 5, 5, 5}; map<int, int> m; for (int i = 0; i < 7; ++i) { if (m.find(a[i]) != m.end()) { m[a[i]]++; // 如果元素已存在,则计数加一 } else { m.insert(pair<int, int>(a[i], 1)); // 如果元素不存在,则插入新键值对并初始化为1 } } for (const auto& it : m) { cout << it.first << " 现了 " << it.second << " 次" << endl; } return 0; } ``` 此外,可以进一步简化代码,利用 `operator[]` 的自动插入功能来直接更新计数,而无需显式检查是否存在对应的键[^4]。 ```cpp #include <iostream> #include <map> using namespace std; int main() { int a[] = {1, 2, 3, 4, 5, 5, 5}; map<int, int> m; for (int i = 0; i < 7; ++i) { m[a[i]]++; // 利用 operator[] 自动插入和默认初始化为0的特性 } for (const auto& it : m) { cout << it.first << " 现了 " << it.second << " 次" << endl; } return 0; } ``` 如果希望提高性能,可以考虑使用 `std::unordered_map`,它基于哈希表实现,查找、插入和删除操作的时间复杂度接近常量级别,适合大规模数据处理。但其缺点是不支持按键排序输。 ### 使用 `std::unordered_map` 的示例 ```cpp #include <iostream> #include <unordered_map> using namespace std; int main() { int a[] = {1, 2, 3, 4, 5, 5, 5}; unordered_map<int, int> um; for (int i = 0; i < 7; ++i) { um[a[i]]++; // 利用 operator[] 自动插入和默认初始化为0的特性 } for (const auto& it : um) { cout << it.first << " 现了 " << it.second << " 次" << endl; } return 0; } ``` 上述方法均能够高效地统计数组中每种元素次数,并且可以根据实际需求选择是否需要有序输(`std::map`)或高性能操作(`std::unordered_map`)[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值