题目描述
若存在一个整数数组 nums,要求将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素,返回满足此条件的任一数组作为答案
? ? ? ? 为什么要说返回任一数组呢!很容易想肯定不止是一种情况!!!
????????[3,1,2,4] 的输入可能得到的输出有 [2,4,1,3] [2,4,3,1] [4,2,1,3] [4,2,3,1] 四种
C 语言具体代码实现
作者的想法是两次遍历!!!
? ? ? ? 具体实现过程是第一次筛选偶数,第二次筛选奇数
#include <stdio.h>
#include <stdlib.h>
int *sortArrayByParity(int *nums, int numsSize, int *returnSize){
int *numArr = (int*)malloc(sizeof(int)*numsSize); // 新数组
int index = 0;
// 两次遍历
for(int i = 0; i < numsSize; i++){
if(nums[i] % 2 == 0){
// 保存偶数
numArr[index++] = nums[i];
}
}
for (int i = 0; i < numsSize; i++) {
if (nums[i] % 2 == 1) {
// 保存奇数
numArr[index++] = nums[i];
}
}
*returnSize = numsSize; // 新数组和原数组相同
return numArr;
}
int main(void){
int arr[6] = {1, 2, 3, 3, 2, 1};
int newlength;
int *newarr = sortArrayByParity(arr, 6, &newlength);
for(int i = 0; i < newlength; i++){
printf("%d ", newarr[i]);
}
// 2 2 1 3 3 1
return 0;
}
?此题还有更为简单的方法:双指针 + 一次遍历!!!
? ? ? ? ?具体来说,就是用一次遍历同时筛选出偶数和奇数
#include <stdio.h>
#include <stdlib.h>
int *sortArrayByParity(int *nums, int numsSize, int *returnSize){
int *numArr = (int*)malloc(sizeof(int)*numsSize); // 新数组
int left = 0, right = numsSize-1;
for(int i = 0; i < numsSize; i++){
if(nums[i] % 2 == 0){
// 偶数
numArr[left++] = nums[i];
}else{
// 奇数
numArr[right--] = nums[i];
}
}
*returnSize = numsSize; // 新数组和原数组相同
return numArr;
}
int main(void){
int arr[6] = {1, 2, 3, 3, 2, 1};
int newlength;
int *newarr = sortArrayByParity(arr, 6, &newlength);
for(int i = 0; i < newlength; i++){
printf("%d ", newarr[i]);
}
// 2 2 1 3 3 1
return 0;
}
|