「这是我参与2022首次更文挑战的第29天,活动详情查看:2022首次更文挑战」
看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起!
题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
示例:
输入: nums = [1,2,3,4]
输出: [1,3,2,4]
注: [3,1,2,4] 也是正确的答案之一。
提示:
0 <= nums.length <= 500000 <= nums[i] <= 10000
解题思路
- 老规矩,先说暴力解
- 我们用两个数组分别存储奇数偶数
- 将数组合并返回
解题代码
var exchange = function(nums) {
let a = [] // 存奇数
let b = [] // 存偶数
nums.forEach(v=>{
if(v%2){ // 对2取余有余数 为奇数
a.push(v)
}else{
b.push(v)
}
})
return [...a,...b]
};
当然,我们可以利用数组的方法还可以这样解
var exchange = function(nums) {
let a = []
nums.forEach(v=>{
if(v%2){
a.unshift(v) // 奇数塞到数组的第一项
}else{
a.push(v) // 偶数塞到最后一项
}
})
return a
};
双指针
当然,处理暴力解以外,我们还可以用双指针来解这道题
- 定义一个指针从
0向后,与此同时我们定义一个指针从后往前 - 当两个指针相遇时退出循环
- 如果左边能整除
2于此用时右边不能整除2,我们就交换左右的位置 - 否则两侧都能整除
2时,右指针-- - 同样的道理,两侧都不能整除2时,左指针
++
var exchange = function(nums) {
let left = 0 // 左指针
let right = nums.length-1 // 右指针
while(left<right){ // 两指针没相遇作为循环条件
if(nums[left]%2===0&&nums[right]%2===1){
[nums[right],nums[left]] = [nums[left],nums[right]] // 交换位置
left++
right--
}else if(nums[left]%2===0){ // 左侧不满足,右侧满足时,寻找不满足的右侧
right--
}else{
left++
}
}
return nums
};
在喜欢你的人那里去热爱生活,在不喜欢你的人那里去看清世界。
如有任何问题或建议,欢迎留言讨论!