zoukankan      html  css  js  c++  java
  • 从数组中删除奇数元素

    #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
  • 相关阅读:
    区间dp体会
    P1083借教室 noip提高组复赛2012
    P2678跳石头体会 noip2015提高组
    tarjan求LCA的体会
    P1006 传纸条
    P1140 相似基因 详解
    UVA1025 城市里的间谍 A Spy in the Metro 题解
    DAG上的动规嵌套矩形问题(含思考题)
    洛谷P1030c++递归求解先序排列
    Test 2019.7.22
  • 原文地址:https://www.cnblogs.com/tangxin-blog/p/8831931.html
Copyright © 2011-2022 走看看