调整数组顺序使得奇数位于偶数前面
调整数组顺序使奇数位于偶数前面
http://www.nowcoder.com/questionTerminal/beb5aa231adc45b2a5dcc5b62c93f593
1. 题目
调整数组顺序使得奇数位于偶数前面
1 2 3 4 5 => 1 3 5 2 4
题目意思很明确,就是将奇数调整到偶数前面,同时需要保证相对位置不变
2. 分析
现在要知道的是需要将所有的奇数移动到数组前面,则肯定是要和偶数交换,但是交换之后,此时相对位置如何保持?
仔细分析可以知道,我们可以使用双指针,这样的话,一旦交换之后,要保持位置,只需要将当前区间内的数都与最后面一个数依次交换,则可保持一个比较正确的顺序。
3. 代码
代码的话跟着上面的分析来的
/**
* 利用双指针来操作
* 如果是奇数就跳过,偶数才开始双指针走
*/
public void reOrderArray(int[] array) {
int odd = 0;
int even = 0;
// 因为even一直向前,所以此时需要使用even作为边界
while (even < array.length) {
// 奇数就直接跳过
if (array[even] % 2 != 0) {
even++;
odd++;
continue;
}
// 只有偶数的时候才处理
while (even < array.length && array[even] % 2 == 0) {
even++;
}
if (even >= array.length) break;
// 到了第一个偶数位置
swap(array, odd++, even);
// 然后交换之前到这一段区间的数字
swapRange(array, odd, even);
}
}
/**
* 交换区间,注意r保持不变,否则相对顺序不可保持
*/
public void swapRange(int[] nums, int l, int r) {
while (l < r) {
swap(nums, l++, r);
}
}
public void swap(int[] nums, int l, int r) {
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
} 4. 小结
本题思路很简单,主要就是双指针和相对位置的变换,只要明确了前进的规则以及交换的规则,写出来还是比较简单的。
Keep thinking, keep coding! In Nanjing!