数组4:数组中使奇数都在偶数前面的三道题

Posted 纵横千里,捭阖四方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组4:数组中使奇数都在偶数前面的三道题相关的知识,希望对你有一定的参考价值。

关于数组的奇偶调整问题,有3道典型的题目。

输入一个整数数组,通过一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。这里可以有两个题目,一个是不要求调整后顺序的,另一个就是这里要求的相对位置不变。

第三个题目是leetcode 922. 按奇偶排序数组 II,要求是索引偶数的位置是偶数,奇数的位置是奇数。

这三道题的一和三思路基本一致,第二个的思路略有不同。

1.不考虑调整后元素的顺序

如果这里没有顺序的要求可以用双指针的方式,从前后两端分别遍历,然后如果遇到需要的再等另外一次也找到,最后调整就行了,代码可以这么写:

public int[] reOrderArray (int[] array)         int left=0, right=array.length-1;         while(left<right){             while(array[left]%2!=0 &&left<right) left++;             while(array[right]%2==0 &&left<right ) right--;             int temp=array[left];             array[left]=array[right];             array[right]=temp;         }        return array;

2.要求调整后的顺序仍与原始数组的顺序一致

对于第二题,这里对顺序也有要求,上面的方式就不行了,为此考虑冒泡的方式交换奇偶:

public int[] reOrderArray (int[] array) {       if (array == null || array.length == 0) return new int[0];        int n = array.length;                 for (int i=0; i<n; ++i) {            for (int j=0; j<n-1-i; ++j) {                // 左边是偶数, 右边是奇数的情况                if ((array[j] & 1) == 0 && (array[j+1] & 1) == 1) {                    int tmp = array[j];                    array[j] = array[j+1];                    array[j+1] = tmp;                }            }        }                 return array;    }

这里需要注意的是,j的循环终止条件为什么是j<n-1-i,而不是其他的呢?比如n-i呢?这里其实就可以用我们说的将两端带入的方式,第一次循环i=0,我们要让j走到底,所以应该是n-1的位置,所以此时就是n-i-1了。

3.leetcode的922题. 按奇偶排序数组 II

给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。

对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。

你可以返回任何满足上述条件的数组作为答案。

 示例:

输入:[4,2,5,7]输出:[4,5,2,7]解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。

提示:

  1. 2 <= A.length <= 20000

  2. A.length % 2 == 0

  3. 0 <= A[i] <= 1000

如果采用双指针方式,与上面的第一题是一个思路,使用两个变量来标记,一个代表奇数位,一个偶数位。遍历到某个位置时,判断奇偶,如果是奇数时奇数标记加2,遇到偶数时,偶数标记位加2.

public int[] sortArrayByParityII(int[] nums) {        int[] res = new int[nums.length];        int o = 0;        int j = 1;        for(int i = 0;i < nums.length;++i){            if(nums[i] % 2 == 0){                res[o] = nums[i];                //到下一个偶数位置等着                o+=2;            }else{                res[j] = nums[i];                //到下一个奇数位置等着                j+=2;            }        }        return res;    }

这种方式也是滑动窗口的基本思想,有大量的题目都与之类似,搞清楚这三题,后面再刷其他的会容易很多。

以上是关于数组4:数组中使奇数都在偶数前面的三道题的主要内容,如果未能解决你的问题,请参考以下文章

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

调整数组顺序使奇数位于偶数前面(C语言+Java)

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

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

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

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 的详细题解