从数组中删除奇数元素

复制代码
#include <iostream>
#include <cstdint>
#include <vector>

// 要求:从很大的数组中删除删除某些特定的元素
// 思路:由于是数组,不要尝试直接删除,否则会导致大量内存拷贝,最好的方法就是元素交换

// 从很大的数组中删除奇数元素
void remove_cardinal(std::vector<int32_t> & vec)
{
    std::vector<int32_t>::size_type i = 0, j = vec.size() - 1;
    while(i < j)
    {
        while(i < j && vec[i] % 2 == 0)++i;
        while(i < j && vec[j] % 2 == 1)--j;
        std::swap(vec[i], vec[j]);
    }
    vec.resize(i);
}

// 从很大的数组中删除奇数元素,但是要保持偶数元素的原有顺序
void remove_cardinal_stable(std::vector<int32_t> & vec)
{
    std::vector<int32_t>::size_type i = 0, j = 0;
    while(i < vec.size() && j < vec.size())
    {
        while(i < vec.size() && vec[i] % 2 == 0)++i;
        j = i + 1;
        while(j < vec.size() && vec[j] % 2 == 1)++j;
        if(j < vec.size())
        {
            std::swap(vec[i], vec[j]);
        }
    }
    vec.resize(i);
}

int32_t main()
{
    {
        std::vector<int32_t> vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        remove_cardinal(vec);
        for(int32_t & v : vec)
        {
            std::cout << v << " ";
        }
        std::cout << std::endl;
    }
    {
        std::vector<int32_t> vec = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        remove_cardinal_stable(vec);
        for(int32_t & v : vec)
        {
            std::cout << v << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}
复制代码

输出结果:

10 2 8 4 6
2 4 6 8 10

 

posted @   你好阿汤哥  Views(2502)  Comments(0Edit  收藏  举报
编辑推荐:
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
阅读排行:
· Cursor预测程序员行业倒计时:CTO应做好50%裁员计划
· 想让你多爱自己一些的开源计时器
· 大模型 Token 究竟是啥:图解大模型Token
· 用99元买的服务器搭一套CI/CD系统
· 当职场成战场:降职、阴谋与一场硬碰硬的抗争
点击右上角即可分享
微信分享提示