每日力扣算法题(简单篇)

发布时间:2024年01月02日

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;
}

文章来源:https://blog.csdn.net/2301_79629995/article/details/135341931
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。