输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
输入: nums = [1,2,3,4]
输出: [1,3,2,4]
注: [3,1,2,4] 也是正确的答案之一。
解法1: 双指针,左边指针从0开始,直到找到一个偶数;右边指针从lenght - 1开始,直到找到一个奇数,然后进行交换,当指针相遇时,输出数组即可。 while循环的时间复杂度和for循环不一样,for循环看的是i的值,while循环看的是循环内部的逻辑
public int[] exchange(int[] nums) {
int left = 0;
int right = nums.length - 1;
int tmp = 0;
while (left < right) {
// 从左开始遍历,直到找到一个偶数
while (left < right && nums[left] % 2 == 1) {
left++;
}
// 从右开始遍历,直到找到一个奇数
while (left < right && nums[right] % 2 == 0) {
right--;
}
// swap
tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
}
return nums;
}
}
易错点:注意内存while循环也要加left < right的判断条件,防止已经交换完成之后,又换回去的情况。比如当left = 1,right = 2时,交换完成之后数组为[1,3,2,4]已经是正确答案,再次进行循环,left = 2,right = 1,又交换完之后变回了[1,2,3,4]。
判断奇数和偶数,也可以使用位运算,n & 1 == 1为奇数,n & 1 == 0 为偶数。奇数转成二进制最后一位一定是1,偶数转成二进制最后一位一定是0,与运算是两边都为1,结果为1,或运算是只要有一个为1,结果就为1,所以n & 1 == 1说明n的最后一位是1,所以为奇数。