恒生电子笔试题

albert901124 2012-10-18 08:45:37
请对输入的一组数据(0~9)进行排序,规则:数据出现次数多的,数字大的排在前面。
例如:6 3 9 4 排序后:9 6 4 3
例如:6 3 3 9 4 排序后:3 9 6 4
...全文
1010 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
陈某某418 2012-10-25
  • 打赏
  • 举报
回复
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
void qsort(int a[], int x, int y);
int main()
{
int ncase, a[11], i;
while (1)
{
cout << "How many datas?" << endl;
cin >> ncase;
memset(a,0,sizeof(a));
cout << "Input your datas:" << endl;
while (ncase--)
{
cin >> i;
if(a[i] == 0)
a[i] = i;
a[i] += 10;
}
for (qsort(a, 0, 9), i = 0; i < 10; i++)
if (a[i] != 0)
cout << a[i]% 10 << " ";
cout << endl;
system("pause");
system("cls");
}
return 0;
}

void qsort(int a[], int x, int y)
{
int xx = x, yy = y;
int k = a[x];
if (x >= y) return ;
while (xx != yy)
{
while (xx < yy && a[yy] <= k)
yy--;
a[xx] = a[yy];
while (xx < yy && a[xx] >= k)
xx++;
a[yy] = a[xx];
}
a[xx] = k;
qsort(a, x, xx-1);
qsort(a, xx+1, y);
}
陈某某418 2012-10-25
  • 打赏
  • 举报
回复
貌似只有我的算法复杂度最小啊亲...
你咋还不结帖啊..
zslInSz 2012-10-19
  • 打赏
  • 举报
回复
lst = '1 1 1 3 5 5 4 6'.split()
d = {}

for e in lst:
e = int(e)
if d.has_key(e):
d[e] += 1
else:
d[e] = 1

lst = sorted(d.items(),lambda x,y: x[0] - y[0],reverse = True)
print sorted(lst,lambda x,y: x[1] - y[1],reverse = True)

复制别人Python写的,我已经运行了是可行的,看起来很简单,可是Python刚刚入门。加快Python的学习进度啊
swordtan 2012-10-19
  • 打赏
  • 举报
回复
写了个,用冒泡排序写的

#include <stdio.h>
typedef struct _Digit{
int num;
int cnt;
} Digit;

void sort(Digit *d){
int i, j;
Digit t;
for(i = 0; i < 10 - 1; ++i)
for(j = 0; j < 10 - i - 1; ++j){
if(d[j].cnt < d[j+1].cnt || (d[j].cnt == d[j+1].cnt && d[j].num < d[j+1].num)){
t = d[j];
d[j] = d[j+1];
d[j+1] = t;
}
}
}

int main() {
Digit digit[10];
int i;
for(i = 0; i < 10; ++i){
digit[i].num = i;
digit[i].cnt = 0;
}
int n, num;
scanf("%d", &n);
while(n > 0){
scanf("%d", &num);
digit[num].cnt++;
--n;
}
sort(digit);
for(i = 0; i < 10; ++i)
if(digit[i].cnt)
printf("%d ", digit[i].num);
return 0;
}



Emiyasstar__ 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

我一大神同学想出来的,开数组int a[10];然后,每出现一次该数,该位加10,然后随便用个排序法排序后,取10余输出即可。
[/Quote]

随便用过排序算法?起码用个稳定排序吧
zslInSz 2012-10-19
  • 打赏
  • 举报
回复
这种问题我这种小菜鸟都可以写出来,应该不需要什么大神吧[Quote=引用 1 楼 的回复:]
我一大神同学想出来的,开数组int a[10];然后,每出现一次该数,该位加10,然后随便用个排序法排序后,取10余输出即可。
[/Quote]
十八道胡同 2012-10-19
  • 打赏
  • 举报
回复
这个相当于是2级排序,就是说
struct
{
int number;
int times;
};

就是先排序times,如果times相同在按照number的大小排序。

用qsort可以做到。

baidu qsort ACM
zslInSz 2012-10-19
  • 打赏
  • 举报
回复

// Map.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
typedef struct
{
int Myself;
int Record;

}HS;
void select_sort(int *x, int n)
{
int i, j, min, t;

for (i=0; i<n-1; i++) /*要选择的次数:0~n-2共n-1次*/
{
min = i; /*假设当前下标为i的数最小,比较后再调整*/
for (j=i+1; j<n; j++)/*循环找出最小的数的下标是哪个*/
{
if (*(x+j) < *(x+min))
{
min = j; /*如果后面的数比前面的小,则记下它的下标*/
}
}

if (min != i) /*如果min在循环中改变了,就需要交换数据*/
{
t = *(x+i);
*(x+i) = *(x+min);
*(x+min) = t;
}
}
};


int main(int argc, char* argv[])
{
HS H_S[10];
int Temp,i=0,HW[10]={0};
for(i=0;i<10;i++)
{
H_S[i].Myself=i;
H_S[i].Record=0;

}
printf("请输入5个0-9之间的数字:");
for (int m=0;m<5;m++)
{
scanf("%d",&Temp);
switch(Temp)
{
case 0:
H_S[0].Record++;
break;
case 1:
H_S[1].Record++;
break;
case 2:
H_S[2].Record++;
break;
case 3:
H_S[3].Record++;
break;
case 4:
H_S[4].Record++;
break;
case 5:
H_S[5].Record++;
break;
case 6:
H_S[6].Record++;
break;
case 7:
H_S[7].Record++;
break;
case 8:
H_S[8].Record++;
break;
case 9:
H_S[9].Record++;
break;
}
}
Temp=0;
for (i=0;i<10;i++)
{
if (H_S[i].Record==0)
continue;
else
{
HW[Temp]=H_S[i].Record*10+H_S[i].Myself;
Temp++;
}
}
select_sort(HW, Temp);
for(i=Temp-1;i>-1;i--)
{
printf("%d",(HW[i]%10));
}
return 0;
}


我做的,运行没问题就是写法比较丑
xiaoxiao8310 2012-10-19
  • 打赏
  • 举报
回复
论坛里有:
http://topic.csdn.net/u/20121018/20/0ab1305d-9378-48b6-b5d2-884f46d97dc7.html?36066
陈某某418 2012-10-19
  • 打赏
  • 举报
回复
我一大神同学想出来的,开数组int a[10];然后,每出现一次该数,该位加10,然后随便用个排序法排序后,取10余输出即可。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧