恒生电子的一道笔试题,在这里跟大家分享一下:
题目如下:输入一组数(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; }