题目
时间限制:1 秒
内存限制:128 兆
特殊判题:否
提交:13
解决:6
- 题目描述:
-
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 输入:
-
每个输入文件包含一组测试案例。对于每个测试案例,第一行输入一个n,代表该数组中数字的个数。接下来的一行输入n个整数。代表数组中的n个数。
- 输出:
-
对应每个测试案例,输入一行n个数字,代表调整后的数组。注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格。
- 样例输入:
-
5 1 2 3 4 5
- 样例输出:
-
1 3 5 2 4
分析
第一种方法AC的,一次遍历,分别保存奇数和偶数分别输出。需要注意的是因为要求最后一个数后面 没有 空格,所以在输出时要判断偶数是否存在。如果没有空格要求的话,可以在一遍遍历时直接输出奇数,保存偶数,再输出偶数第二种方法,从左到右依次查找奇数,然后向前和偶数两两交换,超时了代码
#include <iostream> void judo1516(int n){ int *num = new int[n]; for(int i = 0;i<n;i++){ std::cin>>num[i]; } int *odd = new int[n]; int *even = new int[n]; int neven = 0; int nodd = 0; for(int i = 0;i<n;i++){ if(num[i]&1){ odd[nodd] = num[i]; nodd++; }else{ even[neven] = num[i]; neven++; } } for(int i = 0;i<nodd-1;i++){ std::cout<<odd[i]<<" "; } std::cout<<odd[nodd-1]; if(neven>0){ std::cout<<" "; for(int i = 0;i<neven-1;i++){ std::cout<<even[i]<<" "; } std::cout<<even[neven-1]; } } int main() { int n = 0; while(std::cin>>n){ judo1516(n); } return 0; } /************************************************************** Problem: 1516 User: KES Language: C++ Result: Accepted Time:110 ms Memory:2696 kb ****************************************************************/
#include <iostream> void judo1516(int n){ int *num = new int[n]; for(int i = 0;i<n;i++){ std::cin>>num[i]; } for(int i = 1;i<n;i++){ if(num[i]&1){ int j = i; while(j>0 && !(num[j-1]&1)){ num[j] = num[j-1]^num[j]; num[j-1] = num[j]^num[j-1]; num[j] = num[j-1]^num[j]; j--; } } } for(int i = 0;i<n-1;i++){ std::cout<<num[i]<<" "; } std::cout<<num[n-1]; } int main() { int n = 0; while(std::cin>>n){ judo1516(n); } return 0; } /************************************************************** Problem: 1516 User: KES Language: C++ Result: Time Limit Exceed ****************************************************************/