剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
0 <= nums.length <= 50000
1 <= nums[i] <= 10000
做题思路:
这道题算剑指offer里面理解和做比较简单,但如何用多种思路做题,也是一种学习的方法。
一、借助辅助数组
class Solution {
public int[] exchange(int[] nums) {
int index = 0;
int[] res = new int[nums.length];
//借助两个for循环,把奇数的数放前面,偶数的数放后面,然后再返回res即可
for (int num : nums) {
if (num %2 == 1)
res[index++] += num;
}
for (int num : nums) {
if (num % 2 != 1)
res[index++] += num;
}
return res;
}
}
二、类似于快排或者头尾双指针的方法
class Solution {
public int[] exchange(int[] nums) {
//设置左右指针
int l = 0;
int r = nums.length - 1;
//在while循环里面,l向右移动指向了奇数,r向左移动指向了偶数,只有当l大于r的时候才结束循环。
//当然也会交换l和r所指向的数字
while (l <= r) {
if (l <= r && nums[l] % 2 == 1)
l++;
if (l <= r && nums[r] % 2 == 0)
r--;
if (l > r)
break;
int tmp = nums[l];
nums[l] = nums[r];
nums[r] = tmp;
}
return nums;
}
}
三、快慢双指针
这个做题思路借鉴了LeetCode的郁郁雨。
快慢双指针:
1、slow和fast都设置在数组的头部,而不是像之前一个在头部,一个在数组尾部
2、fast如果遇到奇数,则和slow交换,没有则右移
3、等fast遍历到末尾结束遍历
class Solution {
public int[] exchange(int[] nums) {
int slow = 0, fast = 0;
while (fast < nums.length) {
if (nums[fast] % 2 == 1) {
int tmp = nums[fast];
nums[fast] = nums[slow];
nums[slow] = tmp;
slow++;
}
fast++;
}
return nums;
}
}

浙公网安备 33010602011771号