恒生电子的一道笔试题,在这里跟大家分享一下:

题目如下:输入一组数(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;
}