题目
给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。
对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。
你可以返回 任何满足上述条件的数组作为答案 。
思路
- 交换奇偶数,牺牲内存,双指针交换偶数位上的奇数和奇数位上的偶数
- 遍历,动态一个新数组,遍历A,把偶数放在新数组的偶数位,奇数放在奇数位
方法三:两次遍历
遍历一遍数组把所有的偶数放进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; }