恒生电子的一道笔试题,在这里跟大家分享一下:
题目如下:输入一组数(0~9)之间的任意数,对其进行排序,排序规则:按数字出现的次数排序,次数越多越大、按数字值的大小排序、值越大越大。例如:
排序前 2,3,4,2,3 | 排序后 3,2,4
排序前 2,4, 3 | 排序后 4,3,2
刚开始拿到这个题目的时候,我相信会有很多人说采用两次排序,先对次数排序再对数字排序。但这种方面未免有点拿不出手,我对这道题大致有两种思路:
因为输入的一组数均是0~9之间的数字,所以可以通过一种类hash的方法将数值与对应出现的次数关联起来。具体实现,定义一个二维数组,其中每一维都有两个元素,一个元素用来保存其数值,也即权值。另一个元素用来存储数值与对应出现次数关联后的运算结果,起初的时候每一维数组中的两个元素的值相同,均为原数值,当某一数值再次出现时,则将对应存储权重的加10,依次循环,在最后权重的顺序即为数值的顺序。
我写了一个小的测试例子,如下:
#include <stdio.h>
#include <stdlib.h>
#define ArrayCount 5
int compareArray(const void *a , const void *b)
{
return *(int *)b - *(int *)a;
}
int main(int argc, char* argv[])
{
int index, j, inputValue[ArrayCount], Array[ArrayCount][2];
static int g_Count;
for (index = 0; index < ArrayCount; index++)
{
Array[index][0] = -1;
Array[index][1] = 0;
}
printf("Please input %d Number:\n", ArrayCount);
for (index = 0; index < ArrayCount; index++)
{
scanf("%d", &inputValue[index]);
}
printf("Sort Before :\n");
for (index = 0; index < ArrayCount; index++)
{
for (j = 0; j < ArrayCount; j++)
{
if (Array[j][0] >= 0)
{
if (Array[j][0] == inputValue[index])
{
Array[j][1] += 10;
break;
}
else
{
if (Array[j+1][0] == -1)
{
Array[j+1][0] = inputValue[index];
g_Count++;
Array[j+1][1] = inputValue[index];
Array[j+1][1] += 10;
break;
}
}
}
else
{
Array[j][0] = inputValue[index];
g_Count++;
Array[j][1] = inputValue[index];
Array[j][1] += 10;
break;
}
}
printf("%d\t", inputValue[index]);
}
for (index = 0; index < g_Count; index++)
{
// printf("Array[%d][0] = %d\tArray[%d][1] = %d\n", index, Array[index][0], index, Array[index][1]);
inputValue[index] = Array[index][1];
}
qsort(inputValue, g_Count, sizeof(inputValue[0]), compareArray);
printf("Sort After:\n");
for (index = 0; index < g_Count; index++)
{
printf("%d\t", inputValue[index]%10);
}
return 0;
}
另外一种办法就是定义一个有10个元素的数组Array,将待排序的一组数作为Array数组的下标进行相应的操作。直接上代码吧:
#include<stdio.h>
#include <stdlib.h>
int main()
{
int a[10]={0,0,0,0,0,0,0,0,0,0};
int b[8]={1,1,1,3,5,5,4,6};
int i,j,temp,max;
for(i = 0; i < 8; i++)
{
a[b[i]]++;
}
max=0;
while(1)
{
for(j=9;j>=0;j--)
{
if(a[j]>max&&a[j]!=0)
{
max=a[j];
temp=j;
}
}
if(a[temp]!=0)
{
printf("%d ",temp);
a[temp]=0;
max=0;
}
else
break;
}
system("pause");
return 0;
}
转载于:https://blog.51cto.com/yiluohuanghun/1206945