大家好,我是挨打的阿木木,爱好算法的前端摸鱼老。最近会频繁给大家分享我刷算法题过程中的思路和心得。如果你也是想提高逼格的摸鱼老,欢迎关注我,一起学习。
题目
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
示例:
输入: nums = [1,2,3,4]
输出: [1,3,2,4]
注: [3,1,2,4] 也是正确的答案之一。
提示:
0 <= nums.length <= 500000 <= nums[i] <= 10000
思路
- 用指针的概念,记录一下奇数的个数;
- 一轮遍历,如果遇到的是奇数,把它跟到指针所在的位置交换节点值,指针往后移动一位;
- 如果遇到的偶数不做处理,遍历结束直接返回即可。
实现
/**
* @param {number[]} nums
* @return {number[]}
*/
var exchange = function(nums) {
let pIndex = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] % 2 === 1) {
[ nums[i], nums[pIndex] ] = [ nums[pIndex], nums[i] ];
pIndex++;
}
}
return nums;
};
双指针
我们也可以通过左右两根指针来分别记录奇数位和偶数位的个数,分别从数组的两侧开始寻找,左侧找奇数,右侧找偶数。然后每次遍历所有元素,找到第一个奇数位和第一个偶数位的所在位置,交换元素的位置即可。
/**
* @param {number[]} nums
* @return {number[]}
*/
var exchange = function(nums) {
const n = nums.length;
let left = 0, right = n - 1;
while (left < right) {
while (left < right && nums[left] % 2 === 1) {
left++
}
while (left < right && nums[right] % 2 === 0) {
right--;
}
[ nums[left], nums[right] ] = [ nums[right], nums[left] ];
}
return nums;
};
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。