506.相对名词
原题:
给你一个长度为?n
?的整数数组?score
?,其中?score[i]
?是第?i
?位运动员在比赛中的得分。所有得分都?互不相同?。
运动员将根据得分?决定名次?,其中名次第?1
?的运动员得分最高,名次第?2
?的运动员得分第?2
?高,依此类推。运动员的名次决定了他们的获奖情况:
1
?的运动员获金牌?"Gold Medal"
?。2
?的运动员获银牌?"Silver Medal"
?。3
?的运动员获铜牌?"Bronze Medal"
?。4
?到第?n
?的运动员,只能获得他们的名次编号(即,名次第?x
?的运动员获得编号?"x"
)。使用长度为?n
?的数组?answer
?返回获奖,其中?answer[i]
?是第?i
?位运动员的获奖情况。
解题思路:
名次类型的题目大部分都是要排序的,但这里需要给每个运动员名次,并且要和原数组对应,那么我们可能需要把原数据复制下来,排序后再给名次,但是如果排序了原来的对应关系也就消失了,因此我们就得把原有的编号也保留下来,而能做到这样操作的非结构体莫属了,因此我们有如下代码。
知识储备:
qsort函数,函数原型qsort(指针,元素个数,元素所占字节,比较函数的指针),当要排序的元素是结构体,那么会默认以第一个成员为基准来排序
都看到这里了点个赞把,可以的话点个关注吧
源代码:
struct althe
{
int score;
int number;
};
int cmp(const void* a,const void* b)
{
int numa=*(int*)a;
int numb=*(int*)b;
return numa>numb?1:-1;
}
char** findRelativeRanks(int* score, int scoreSize, int* returnSize) {
struct althe save[scoreSize];
char *one="Gold Medal",*two="Silver Medal",*three="Bronze Medal";
*returnSize=scoreSize;
for(int i=0;i<scoreSize;i++)
{
save[i].number=i;
save[i].score=score[i];
}
qsort(save,scoreSize,sizeof(struct althe),cmp);
char **ans=malloc(sizeof(char*)*scoreSize);
ans[save[scoreSize-1].number]=one;
if(scoreSize==1)
{
return ans;
}
ans[save[scoreSize-2].number]=two;
if(scoreSize==2)
{
return ans;
}
ans[save[scoreSize-3].number]=three;
for(int i=scoreSize-4;i>=0;i--)
{
char *this=malloc(sizeof(char)*6);
sprintf(this,"%d",scoreSize-i);
ans[save[i].number]=this;
}
return ans;
}