-
题目描述:
-
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
-
输入:
-
每个输入文件包含一组测试案例。
对于每个测试案例,第一行输入一个n,代表该数组中数字的个数。
接下来的一行输入n个整数。代表数组中的n个数。
-
输出:
-
对应每个测试案例,
输入一行n个数字,代表调整后的数组。注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格。
-
样例输入:
-
5 1 2 3 4 5
-
样例输出:
-
1 3 5 2 4
解法:最容易想到的 就是,设置2个辅助数组a[],b[],将奇偶数分别复制到a[],b[],然后按题目要求合并到原数数组。剑指Offer中采用 头尾两个指针交换的方法,但是这种方法不能保证九度OJ上数字间相对位置不变的条件。
-
#include <stdio.h> //#define MaxSize 100 void reOrderArray(int n) { int *array=NULL,*b=NULL,*a=NULL,i,even=0,odd=0; array=(int *)malloc( sizeof(int) * n ); /*申请动态数组使用的内存块*/ b=(int *)malloc( sizeof(int) * n ); a=(int *)malloc( sizeof(int) * n ); for(i=0;i<n;i++) { scanf("%d",&array[i]); a[i]=0; b[i]=0; if(array[i]%2!=0) { b[even++]=array[i]; } else { a[odd++]=array[i]; } } for(i=0;i<n;i++) { if(i<even)array[i]=b[i]; else array[i]=a[i-even]; printf("%d",array[i]); if(i<n-1)putchar(' '); } } int main() { const int n ; scanf("%d",&n); reOrderArray(n); } /************************************************************** Problem: 1516 User: tcals Language: C Result: Accepted Time:80 ms Memory:2088 kb ****************************************************************/