剑指offer_13:调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
1 <= nums.length <= 50000
1 <= nums[i] <= 10000
1、复制数组
新建一个数组,两次遍历,第一次将奇数存入,第二次将偶数存入
class Solution {
public int[] exchange(int[] nums) {
int len=nums.length;
int[] res=new int[len];
int index=0;
for(int i=0;i<len;i++){
if(nums[i]%2!=0){
res[index++]=nums[i];
nums[i]=0;
}
}
for(int i=0;i<len;i++){
if(nums[i]!=0){
res[index++]=nums[i];
}
}
return res;
}
}
2、双指针
p1指针呆在原地,p2往前走直到遇到奇数,p1和p2的数组元素互换,p1往前走一个。
class Solution {
public int[] exchange(int[] nums) {
int len=nums.length;
int p1=0,p2=0;
while(p2<len){
if(nums[p2]%2!=0){
swap(nums,p1,p2);
p1++;
}
p2++;
}
return nums;
}
public void swap(int[] nums,int a,int b){
int temp=nums[a];
nums[a]=nums[b];
nums[b]=temp;
}
}
3、首尾双指针
一点快排的思想,首指针遇到偶数停下,尾指针遇到奇数停下,然后两个指针所指元素互换
判断奇偶数使用位运算
class Solution {
public int[] exchange(int[] nums) {
int len=nums.length;
int p1=0,p2=len-1;
while(p1<p2){
if((nums[p1]&1)!=0){
p1++;
continue;
}
if((nums[p2]&1)==0){
p2--;
continue;
}
swap(nums,p1,p2);
}
return nums;
}
public void swap(int[] nums,int a,int b){
int temp=nums[a];
nums[a]=nums[b];
nums[b]=temp;
}
}