掘金团队号上线,助你 Offer 临门! 点击 查看详情
一、题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输入
nums = [1,2,3,4]
输出
[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示
1 <= nums.length <= 50000
1 <= nums[i] <= 10000
二、思路分析
我的思路
从前往后找偶数,找到偶数再从后往前找奇数,找到2个数做个交换
最佳思路
这题目可以2种解法:
- 上面我想到的那种应该叫做:首尾双指针
- 还有快慢指针法:
- 2个指针从头开始遍历,1个遇到了奇数停下来,1个遇到偶数停下来,然后2个做个交换
- 其实和收尾双指针一样的,慢的指针从头开始找偶数,块的指针不断往后面去找到奇数,然后做交换,也就是我是从后往前取奇数,而他是从前往后取奇数。
三、AC 代码
最佳写法:
public int[] exchange(int[] nums) {
int i = 0;
int j = nums.length - 1;
for (; i < nums.length; i++) {
if (i >= j) {
break;
}
//get新的点:判断奇偶数 使用&1 == 1 表示是奇数 ==0 表示是偶数
if ((nums[i] & 1) == 0) {
for (; j > i; j--) {
if ((nums[j] & 1) == 1) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
break;
}
}
}
}
return nums;
}
四、总结
力扣上标记为中等的简单题 😄