剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
1、用两个数组分别遍历存储奇偶数
var exchange = function(nums) {
if(!nums) return []
let oddArr = [], evenArr = []
for(let i = 0; i < nums.length; i++){
if(nums[i] % 2 == 0){
evenArr.push(nums[i])
}else{
oddArr.push(nums[i])
}
}
return oddArr.concat(evenArr)
};
时间复杂度O(n) 空间复杂度O(n)
2、双指针
var exchange = function(nums) {
if(!nums) return []
let i = 0, j = nums.length - 1
while(i < j){
while(nums[i] % 2 != 0 && i < j) i++
while(nums[j] % 2 == 0 && i < j) j--
[nums[i], nums[j]] = [nums[j], nums[i]]
}
return nums
};
时间复杂度O(n) 空间复杂度O(1)
刚开始内层while循环没有加 i < j 判断条件,报错,如果不加的话当满足正确答案后,数组中间两个数字还会进行交换一次,所以报错。
判断是否为奇偶数还可以用位运算
x & 1 == 1 奇
x & 1 == 0 偶