您的位置:首页 > 职场人生

分享一道百度笔试程序题

2017-09-12 16:33 204 查看
有个朋友去百度面试,带回来一道笔试题,题目如下:



题目大意就是这样!

初步分析挺简单的嘛,不就是当收到的礼物超过K个时,接下来每次拿到手一个礼物之后,和手里的K个礼物做对比,淘汰K个里面比当前手里礼物价值低的里面的最低的一个!

不过,写的时候还是把自己绕沟里去了,修改了一次才成功。

下面是代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int n = 0;          //礼物总数
int K = 0;          //要留下来的礼物数
int num = 0;        //要留下来的礼物喜好值之和

int * val = NULL;   //所有礼物喜好值数组指针

int main(void)
{
int i,x,y,temp;

//输入礼物总数量
printf("present quantity(>0): ");
scanf("%d", &n);
printf("M will get present: n = %d !\n", n);

//输入要留下来的礼物数量
printf("leave quantity(>0 && <=n): ");
scanf("%d", &K);
printf("M will leave present: K = %d !\n\n", K);

//分配所有礼物喜好值数组内存空间,并初始化为0
val = (int *)calloc(n, sizeof(int));
if(val == NULL)
{
printf("calloc failed!!!!!!\n");
return -1;
}

//初始化随机数种子
srand((unsigned)time(NULL));
for(i = 0; i < n; i++)
{
//随机生成一个0~100的礼物喜好值
val[i] = (rand() % 100);
printf("%d present, val: %d \n", (i + 1), val[i]);

//如果收到的礼物数量还没有超过要留下来的礼物数量
if(i < K)
{
//那么喜好值之和就等于目前所有礼物喜好值之和
num += val[i];
}
//如果收到的礼物数量超过了要留下来的礼物数量
else
{
//对目前所有礼物按照从大到小喜好值排序
for(x = 0; x < (i + 1); x++)
{
for(y = (x + 1); y < (i + 1); y++)
{
if(val[y] > val[x])
{
temp = val[y];
val[y] = val[x];
val[x] = temp;
}
}
}

num = 0;    //重置喜好值之和

//打印排序结果,并计算目前要留下来的礼物喜好值之和
printf("now rank: ");
for(x = 0; x < (i + 1); x++)
{
if(x < K)   //只需要喜好值最大的 K 个礼物
{
num += val[x];
}
printf("%d ", val[x]);
}
printf("\n");
}

//打印目前要留下来的礼物的喜好值之和
printf("leave present total val: num = %d \n\n", num);
}

free(val);      //释放礼物喜好值数组内存空间
val = NULL;

return 0;
}


运行结果如下:



欢迎大家交流!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息