题目链接:https://leetcode.cn/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/
1. 题目介绍(21. 调整数组顺序使奇数位于偶数前面)
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
【测试用例】:
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
【条件约束】:
提示:
- 0 <= nums.length <= 50000
- 0 <= nums[i] <= 10000
2. 题解
2.1 双指针 – O(n)
时间复杂度O(n),空间复杂度O(1)
class Solution {
public int[] exchange(int[] nums) {
// 定义首尾索引
int left = 0;
int right = nums.length-1;
// 整体思路:(奇偶交换)
// 即: 从左边开始遍历,发现偶数时停下
// 从右边开始遍历,发现奇数时停下
// 判断左边是否仍小于右边
// 如果成立,则彼此交换
while (left < right){
while (left < right && nums[left] % 2 != 0){
left++;
}
while (left < right && nums[right] % 2 == 0){
right--;
}
if (left < right){
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
}
return nums;
}
}
2.2 可扩展的解法
当遇到存在共性,相同套路可解决其它问题的代码,可以将其抽象成一个方法,如 nums[left] % 2 != 0
与 nums[right] % 2 == 0
,我们就可以将其抽象成一个判断是否能被2整除的方法:
public boolean isEven(int n){
return (n & 1) == 0;
}
3. 参考资料
[1] 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(双指针,清晰图解)-- 图片来源