剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
解答
class Solution {
/**
双指针
两个指针从相同的一端出发
*/
/*
public int[] exchange(int[] nums) {
if(nums.length == 0){
return nums;
}
int even,odd; //even指向偶数,odd指向奇数
even = odd = 0;
while(even < nums.length&&odd < nums.length){
while(even < nums.length&&nums[even]%2 != 0){
even++;
}
while(odd < nums.length&&nums[odd]%2 == 0){
odd++;
}
System.out.println("even:"+even+"odd:"+odd);
if(even < nums.length&&odd < nums.length){
//System.out.println("*************");
if(even < odd){
int mid = nums[even];
nums[even] = nums[odd];
nums[odd] = mid;
}else{ //指向奇数的指针向后找,看后面还有没有奇数
odd++;
}
}
}
return nums;
}
*/
/**
双指针
一个从前往后left,一个从后往前right
当left遇到奇数直接+1,直到left指向的元素为偶数或者i和j相等
当right遇到偶数直接-1,直到right指向的元素为奇数或者i和j相等
当left指向的元素为偶数,right指向的元素为奇数时,交换两元素的位置,left+1,right-1
*/
public int[] exchange(int[] nums) {
if(nums.length == 0){
return nums;
}
int left,right;
left = 0;
right = nums.length - 1;
while(left != right){
while(left != right&&nums[left]%2 == 1){
left++;
}
while(left != right&&nums[right]%2 == 0){
right--;
}
int mid;
mid = nums[left];
nums[left] = nums[right];
nums[right] = mid;
}
return nums;
}
}