给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。
对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。
你可以返回 任何满足上述条件的数组作为答案 。
方法三:两次遍历
遍历一遍数组把所有的偶数放进ans[0],ans[2],ans[4],以此类推。
再遍历一遍数组把所有的奇数依次放进 ans[1],ans[3],ans[5],以此类推。方法四:双指针 如果原数组可以修改,则可以使用就地算法求解。 为数组的偶数下标部分和奇数下标部分分别维护指针 i,j。随后,在每一步中,如果
nums[i] 为奇数,则不断地向前移动 j(每次移动两个单位),直到遇见下一个偶数。此时,可以直接将nums[i] 与 nums[j]
交换。我们不断进行这样的过程,最终能够将所有的整数放在正确的位置上。来源:力扣(LeetCode)
方法一:交换奇偶数
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* sortArrayByParityII(int* A, int ASize, int* returnSize){
*returnSize = ASize;
int* returnArray = (int*)malloc(sizeof(int) * ASize);
int tmp;
for(int i = 0; i < ASize; i = i + 2){
for(int j = 1; j< ASize; j = j + 2){
if( A[i]%2!=0 && A[j]%2==0 ){
tmp = A[i];
A[i] = A[j];
A[j] = tmp;
break;
}
}
}
return A;
}
方法二:遍历
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* sortArrayByParityII(int* A, int ASize, int* returnSize){
*returnSize = ASize;
int* returnArray = (int*) malloc(sizeof(int) * ASize);
for (int i = 0, j = 1, k = 0; k < ASize; k++) {
// 遍历偶数
if (A[k] % 2 == 0) {
returnArray[i] = A[k];
i = i + 2;
}
// 遍历奇数
else {
returnArray[j] = A[k];
j = j + 2;
}
}
return returnArray;
}