题目来源:leetcode 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
0 <= nums.length <= 50000
0 <= nums[i] <= 10000
分析1 利用数组sort函数
- 从实例中 输出:[1,3,2,4]与输出:[3,1,2,4]都是正确答案
- 可以看出只与值取余的结果有关
- 通过这一点我们可以进行从大到小排序
代码实现1 利用数组sort函数
/**
* @param {number[]} nums
* @return {number[]}
*/
var exchange = function(nums) {
return nums.sort((a,b)=>b%2-a%2)
};
分析2 利用分治思想
- 定义
odd存放奇数,even存放奇数 - 遍历
nums将值取余2为0的存入even - 否则将值存入
odd中 - 遍历完毕后通过
odd.concat(even)将俩数组合并并返回
代码实现2 利用分治思想
/**
* @param {number[]} nums
* @return {number[]}
*/
var exchange = function(nums) {
const odd = []
const even = []
for(let i = 0; i < nums.length; i++){
if(nums[i] % 2 === 0){
even.push(nums[i])
}else{
odd.push(nums[i])
}
}
return odd.concat(even)
};
分析3 双指针
- 定义
left赋值为0, - 定义
right赋值为nums.length - 1 - 当
left对应的值为奇数并left < right,left++ - 当
right对应的值为偶数并left < right,right-- - 将左右值进行交互
- 最后返回
nums
代码实现3 双指针
/**
* @param {number[]} nums
* @return {number[]}
*/
var exchange = function(nums) {
let left = 0
let right = nums.length - 1
while(left < right){
while(left < right && nums[left] % 2 == 1){
left++
}
while(left < right && nums[right] % 2 == 0){
right--
}
if (left < right) {
[nums[left], nums[right]] = [nums[right], nums[left]];
}
}
return nums
};
以上三种实现方式都可以通过位运算进行优化 (n&1)