剑指offer:81-题解 | #调整数组顺序使奇数位于偶数前面(二)#

调整数组顺序使奇数位于偶数前面(二)

http://www.nowcoder.com/practice/0c1b486d987b4269b398fee374584fc8

题目描述:


输入一个长度为 n 整数数组,数组里面可能含有相同的元素,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,对奇数和奇数,偶数和偶数之间的相对位置不做要求,但是时间复杂度和空间复杂度必须如下要求。

数据范围:0≤n≤50000,数组中每个数的值 0 ≤val≤10000
要求:时间复杂度 O(n),空间复杂度 O(1) 示例1 输入: [1,2,3,4]
返回值: [1,3,2,4]
说明: [3,1,2,4]或者[3,1,4,2]也是正确答案


题解1:双指针


  1. 定义双指针,left指向最左边,right指向数组最右边
  2. 当left < right 时,用while寻找最左边的偶数和寻找最右边的奇数
  3. while(array[left] & 1 == 1)当left指向的数是奇数时,left++,指向下一个数值,直至指向偶数
  4. while(array[right] & 1 == 0)当right指向的数是偶数时,right--,指向下一个数值,直至指向奇数
  5. 当left < right 时,交换

图示来自代码届的小白

alt

代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param array int整型vector 
     * @return int整型vector
     */
    vector<int> reOrderArrayTwo(vector<int>& array) {
        // write code here
        //双向队列法
//         deque<int> de;
//         for(int i:array){
//             if(i & 1 == 1)//奇数
//                 de.push_front(i);
//             else
//                 de.push_back(i);
//         }
//         vector<int> v;
//         for(int i = 0;i< de.size();i++){
//             v.push_back(de[i]);
//         }
//         return v;
        //双指针法
        if(array.size() < 2 ) return array;
        int l =0,r = array.size() - 1;
        while(l < r){
            while((array[l]&1) == 1) l++;//找到奇数
            while((array[r]&1) == 0) r--;//找到偶数
            if(l<r){
                int temp = array[l];
                array[l] = array[r];
                array[r] = temp;                
            }
        }
        return array;
    }
};
全部评论

相关推荐

05-07 19:10
已编辑
中国科学技术大学 C++
silly01:现在先去 momenta,8-9月去鹅找日常实习,八股文算法背好了你这随便进。不过建议补充一下后端知识,MySQL、Redis看下八股,再补个6824,加点go后台的技术栈,9月随便进大厂。CPP后端只能来WXG
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务