打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
剑指offer(C++)-JZ21:调整数组顺序使奇数位于偶数前面(一)(算法-其他)

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

数据范围:0≤n≤5000,数组中每个数的值0≤val≤10000

要求:时间复杂度 O(n),空间复杂度 O(n)

进阶:时间复杂度 O(n2),空间复杂度 O(1)

示例:

输入:

[2,4,6,5,7]

返回值:

[5,7,2,4,6]

解题思路:

本题考察算法思维。两种解题思路:

1)定位法

       进行一次遍历,确认奇数数量;再次遍历,以奇数数量作为偶数开始放置的下标,完成分割线的定位;以0作为奇数开始放置的下标,再进行一次遍历即可,记得下标刷新。

2)分组法

       巧妙应用stable_partition函数和Lamda表达式,stable_partition函数是稳定的分组函数,通过Lamda表达式确认分组的要求,将奇数分一组,偶数分一组,分组后其相对位置也不变。

测试代码:

1)定位法

#include <vector>
class Solution {
public:
    // 重排序
    vector<int> reOrderArray(vector<int>& array) {
        int size = int(array.size());
        vector<int> result(size);
        // 统计奇数个数
        int odd = 0;
        for(int i = 0; i < size; ++i){
            if(array[i] % 2){
                odd++;
            }
        }
        // 放置数据
        int o = 0;
        int e = odd;
        for(int i = 0; i < size; ++i){
            if(array[i] % 2){
                result[o] = array[i];
                o++;
            }
            else{
                result[e] = array[i];
                e++;
            }
        }
        return result;
    }
};

2)分组法

#include <vector>
class Solution {
public:
    // 重排序
    vector<int> reOrderArray(vector<int>& array) {
        stable_partition(array.begin(), array.end(), [](int x){
            return x % 2 == 1;
        });
        return array;
    }
};
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
每日一题 剑指offer(调整数组顺序)
剑指offer之调整数组顺序使奇数位于偶数前面
【Unity面试篇】Unity 面试题总结甄选 |算法相关 | ❤️持续更新❤️
剑指offer 13 调整数组顺序使奇数位于偶数前面
算法41(调整数组顺序使奇数位于偶数前面)
在Java数组中将数组中的奇数置后偶数置前(两种不同的方法实现)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服