剑指Offer调整顺序使奇数位于偶数前面
来源:互联网 发布:从零开始学日语软件 编辑:程序博客网 时间:2024/05/24 00:22
要求输入一串整数,使奇数位于偶数前面。九度OJ上平台还要求顺序上保持不变,这样也是为了答案的测评,但是如果这样的话,我感觉本身要考察的意义就没有了。这题我们可以像旋转数组那题一样,定义一个头指针和一个尾指针。一个++,一个--。当头部指针指向的值为偶数且尾部指针指向的值为奇数事进行互换。当头部指针>=尾部指针即可终止循环。当然也有其他常规做法,但是都没有这个优化,要么需要辅助空间,每次O(n)的时间,要么不需要辅助空间,o(n^2)的时间。这题还有一个优化的地方就是程序的可扩展行,我们在移动的时候可以重新定义一个函数不如叫bool iseven();进行判断是否符合条件,在一定程度上进行解耦,增加了可扩展性。但是这种方法不能OJ因为要求不一样,这样做的话就不能导致顺序不变,比如1,2,3,4,5的结果是1 5 3 4 2,但是5 1 3 4 2也是符合的,因此九度为了方便测评加了限制条件,但代价就是失去了此种方法
非OJ代码:
#include <stdio.h>#include <iostream>#include <string.h>#include <stdlib.h>using namespace std;bool isEven(int n){ return (n&1)==1;}void Reorder(int *numberbegin,int *numberend){ while(numberbegin<=numberend) { while(numberbegin<numberend&&isEven(*numberbegin)) numberbegin++; while(numberbegin<numberend&&!isEven(*numberend)) numberend--; if(numberbegin<numberend) std::swap(*numberbegin, *numberend); numberbegin++; numberend--; }}int main(){ // freopen("/Users/sanyinchen/Workspaces/oc/conse/B_ali/B_ali/in.txt","r",stdin); int n,a[1000000]; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) scanf("%d",&a[i]); Reorder(a, a+n-1); bool flag=false; for(int i=0;i<n;i++) { if(flag)printf(" "); else flag=true; printf("%d",a[i]); } printf("\n"); } return 0;}
AC代码:
#include <stdio.h>#include <iostream>#include <string.h>#include <stdlib.h>using namespace std;void Reorder(int *number,int n){ int *oddnumber=new int[n]; int *evenumber=new int[n]; int oi=0,ei=0,ai=0;; for(int i=0;i<n;i++) { if((number[i]&0x1)==1) { oddnumber[oi++]=number[i]; } else { evenumber[ei++]=number[i]; } } for(int i=0;i<oi;i++) number[ai++]=oddnumber[i]; for(int i=0;i<ei;i++) number[ai++]=evenumber[i]; delete []oddnumber; delete []evenumber;}int main(){ //freopen("/Users/sanyinchen/Workspaces/oc/conse/B_ali/B_ali/in.txt","r",stdin); int n,a[1000000]; while(scanf("%d",&n)!=EOF) { for(int i=0;i<n;i++) scanf("%d",&a[i]); Reorder(a, n); bool flag=false; for(int i=0;i<n;i++) { if(flag)printf(" "); else flag=true; printf("%d",a[i]); } printf("\n"); } return 0;}
0 0
- 剑指offer:调整数组顺序使奇数位于偶数前面
- 剑指Offer调整顺序使奇数位于偶数前面
- 剑指offer--调整数组顺序使奇数位于偶数前面
- 剑指offer 调整数组顺序使奇数位于偶数前面
- 《剑指offer》调整数组顺序使奇数位于偶数前面
- 剑指 offer:调整数组顺序使奇数位于偶数前面
- 剑指offer-调整数组顺序使奇数位于偶数前面
- 剑指offer 调整数组顺序使奇数位于偶数前面
- 剑指offer-调整数组顺序使奇数位于偶数前面
- 剑指offer 调整数组顺序使奇数位于偶数前面
- 【剑指offer】调整数组顺序使奇数位于偶数前面
- [剑指offer]调整数组顺序使奇数位于偶数前面
- 剑指offer:调整数组顺序使奇数位于偶数前面
- 【剑指offer】调整数组顺序使奇数位于偶数前面
- 剑指offer|调整数组顺序使奇数位于偶数前面
- 《剑指offer》调整数组顺序使奇数位于偶数前面
- 剑指Offer:调整数组顺序使奇数位于偶数前面
- 剑指offer - 调整数组顺序使奇数位于偶数前面
- C++ time(NULL) 计算持续的时间长度
- 如何优化cocos2d/x程序的内存使用和程序大小
- 线程的同步机制
- TC srm 632 div1
- 彻底搞清楚C/C++中日期和时间 time_t与struct tm,time(NULL),ctime;strftime
- 剑指Offer调整顺序使奇数位于偶数前面
- 05_从尾到头打印链表
- C语言运算符优先级
- hd1176
- Oracle中session和processes的设置
- fscanf 读取文件错误
- ZigZag Conversion
- linux设备驱动——NandFlash驱动程序
- 用模板写冒泡排序-链表