剑指offer_13:调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。

提示:
1 <= nums.length <= 50000
1 <= nums[i] <= 10000

1、复制数组

新建一个数组,两次遍历,第一次将奇数存入,第二次将偶数存入

class Solution {
    public int[] exchange(int[] nums) {
        int len=nums.length;
        int[] res=new int[len];
        int index=0;
        for(int i=0;i<len;i++){
            if(nums[i]%2!=0){
                res[index++]=nums[i];
                nums[i]=0;
            }
        }
        for(int i=0;i<len;i++){
            if(nums[i]!=0){
                res[index++]=nums[i];
            }
        }
        return res;
    }
}

2、双指针

p1指针呆在原地,p2往前走直到遇到奇数,p1和p2的数组元素互换,p1往前走一个。

class Solution {
    public int[] exchange(int[] nums) {
        int len=nums.length;
        int p1=0,p2=0;
        while(p2<len){
            if(nums[p2]%2!=0){
                swap(nums,p1,p2);
                p1++;
            }
            p2++;
        }
        return nums;
    }
    public void swap(int[] nums,int a,int b){
        int temp=nums[a];
        nums[a]=nums[b];
        nums[b]=temp;
    }
}

3、首尾双指针

一点快排的思想,首指针遇到偶数停下,尾指针遇到奇数停下,然后两个指针所指元素互换

判断奇偶数使用位运算

class Solution {
    public int[] exchange(int[] nums) {
        int len=nums.length;
        int p1=0,p2=len-1;
        while(p1<p2){
            if((nums[p1]&1)!=0){
                p1++;
                continue;
            }
            if((nums[p2]&1)==0){
                p2--;
                continue;
            }
            swap(nums,p1,p2);
        }
        return nums;
    }
    public void swap(int[] nums,int a,int b){
        int temp=nums[a];
        nums[a]=nums[b];
        nums[b]=temp;
    }
}
posted @ 2020-11-26 19:15  小昊子丫  阅读(69)  评论(0编辑  收藏  举报