数组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] 也会被接受。
提示:
-
2 <= A.length <= 20000
-
A.length % 2 == 0
-
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:数组中使奇数都在偶数前面的三道题的主要内容,如果未能解决你的问题,请参考以下文章