华为机试题——数组排序,且奇数存在奇数位置,偶数存在偶数位置
题目要求很简单,就是给你一个数组,对它进行排序,并且排序后,奇数要放在奇数的位置上,偶数要放在偶数的位置上,如果不满足这个规则的话就在数组上填充0
实现代码如下,文中值得注意的一点就是如何判读这个数字是奇数或者偶数,我想使用位运算是最快速的方法了。
// test_huawei.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <string.h> using namespace std; #define T 10 int _tmain(int argc, _TCHAR* argv[]) { //实现奇数放在奇数的位置上 偶数放在偶数位置上 如果不是 添0 int a[T]={1,2,23,1,23,32,56,9,21,33}; int b[2*T]={0}; //考虑最坏情况 新的数组应该是原数组的两倍大(严格来说是2T-1) int i,j,temp; for (i=0;i<T;i++) { for (j=i+1;j<T;j++) { if (a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; //冒泡排序 } } } j=0; for (i=0;i<T;i++) { cout<<a[i]<<"\t"; if (a[i]&1) //奇数 //使用位与操作 减小运算量 { if ((j+1)&1)//奇数位置 b[j]=a[i]; else { b[j]=0; b[j+1]=a[i]; j++; } } else //偶数 { if ((j+1)&1) { b[j]=0; b[j+1]=a[i]; j++; } else b[j]=a[i]; } j++; } cout<<endl; for (i=0;i<2*T;i++) { cout<<b[i]<<" "; } cout<<endl; return 0; }
执行效果: