剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
0 <= nums.length <= 50000
0 <= nums[i] <= 10000
解题思路
题目很好理解
法一:暴力
自己写的很笨的方法,没啥好说的。就是按照题意,用for循环遍历数组,奇数存一组,偶数存一组。最后先遍历奇数数组再遍历偶数数组,存入答案数组中。
法二:双指针
本质上就是一个数组分组排序问题。双指针是真的好用。
左指针,从左往右找奇数;
右指针,从右往左找偶数;
左指针所指偶数与右指针所指奇数交换。
java代码
//法一
class Solution {
public int[] exchange(int[] nums) {
int len = nums.length;
int[] ji = new int[len];
int[] ou = new int[len];
int cnt1 = 0;
int cnt2 = 0;
int t = 0;
int p =0;
for(int i=0; i<len; i++){
if(nums[i] % 2 != 0){
ji[p] = nums[i];
p++;
cnt1++;
}
else{
ou[t] = nums[i];
t++;
cnt2++;
}
}
int[] res = new int[len];
for(int i=0; i<cnt1; i++){
res[i] = ji[i];
t=i;
}
t=0;
for(int i=len-1; i>cnt1-1; i--){
res[i] = ou[t];
t++;
}
return res;
}
}
//法二
class Solution {
public int[] exchange(int[] nums) {
//定义两个指针
int left = 0, right = nums.length - 1, tmp;
while(left < right) {//两指针重合时跳出循环
while(left < right && (nums[left] % 2) != 0) {
left++;//找到偶数跳出
}
while(left < right && (nums[right] % 2 ) == 0) {
right--;//找到奇数跳出
}
//交换
tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
}
return nums;
}
}