您的位置:首页 > 其它

华为招聘机试整理14:数组奇数偶数排序

2014-07-11 17:12 363 查看


华为招聘机试整理14:数组奇数偶数排序

题目:数组奇数偶数排序

对一个数组,将数组中偶数从大到小排序,奇数从小到大排序,奇数和偶数交叉着放且输出数组第一位放奇数 若奇数和偶数不等长,则把剩下的直接放到数组中。

题目分析:

本题主要就是考查整型数组之间的排序
算法思路:

①先循环判断每个数的奇数偶数,分别放入奇数数组中,偶数数组中

②用sort将奇数数组和偶数数组排序

③比较奇数数组和偶数数组个数的大小关系

④根据题目要求组织存放数据

==========================================================================
参考代码:
//数组奇数偶数排序.cpp
//2014.7.11 hepanhui
#include <iostream>
#include <algorithm>
const int maxn = 100;
using namespace std;

bool compare(const int a, const int b)
{
return a > b;
}

void Sorted(int a[], int n)
{
int odd[maxn];
int even[maxn];
int k = 0, j = 0, m1 = 0;
int cnt1 = 0,cnt2 = 0;
for(int i = 0; i < n; i++)
{
if(a[i]%2)
{
odd[k++] = a[i];
cnt1++;
}
else
{
even[j++] = a[i];
cnt2++;
}
}
odd[k++] = '\0';
even[j++] = '\0';

sort(odd, odd + cnt1);
sort(even, even + cnt2, compare);

if(cnt1 >= cnt2)
{
for(int m = 0; m < cnt2; m++)
{
a[m + m1] = odd[m];
a[m + m1 + 1] = even[m];
m1 = m1 + 1;
}
for(int i = 0; i < cnt1 - cnt2; i++)
{
a[2*cnt2 + i] = odd[i+cnt2];
}
}
else
{
for(int m = 0; m < cnt1; m++)
{
a[m + m1] = odd[m];
a[m + m1 + 1] = even[m];
m1 = m1 + 1;
}
for(int i = 0; i < cnt2 - cnt1; i++)
{
a[2*cnt1 + i] = even[i+cnt1];
}
}
a[n+1] = '\0';
}

int main()
{
int a[10] = {2, 3, 14, 6, 2, 15, 12, 14, 4, 11};
Sorted(a,10);
for(int i = 0; i<10-1; i++)
cout << a[i] << " ";
cout << a[10-1] << endl;
return 0;
}


调试中易犯的错误:

①不要忘记odd[k++] = '\0' even[j++] = '\0'

②这里需要注意组织整理存放数据的时候,一定要区分于《华为招聘机试整理7:给定一个数组input[]》这道题目,m1这里是加1,这里特别容易犯错,因为我们m每次循环的时候都加了1

③不要忘记a[n+1] = '\0'切记不能写成a
= '\0'

③对于整型数组主函数的时候,一定要注意个数n需要标识,如果嫌麻烦,我们直接给具体数字④对于这里也可以采用申请动态内存空间来保存奇数数组和偶数数组

int *odd = (int *)malloc(sizeof(int)
* n);

int even = (int *)malloc(sizeof(int) *
n);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐