506. 相对名次

haimian
2025-02-06 / 0 评论 / 7 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2025年02月06日,已超过72天没有更新,若内容或图片失效,请留言反馈。

给你一个长度为 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 位运动员的获奖情况。

示例 1:

输入:score = [5,4,3,2,1]
输出:["Gold Medal","Silver Medal","Bronze Medal","4","5"]
解释:名次为 [1st, 2nd, 3rd, 4th, 5th] 。
示例 2:

输入:score = [10,3,8,9,4]
输出:["Gold Medal","5","Bronze Medal","Silver Medal","4"]
解释:名次为 [1st, 5th, 3rd, 2nd, 4th] 。

上代码

m6tg18z9.png

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int cmp(const void*a, const void*b){
    return *(int*)a - *(int*)b;
}
char ** findRelativeRanks(int* score, int scoreSize, int* returnSize){
    char **ret = (char**)malloc(scoreSize*sizeof(char*));
    (*returnSize) = scoreSize;
    for(int i = 0; i < scoreSize; i++){
        ret[i] = (char*)malloc(sizeof(char)*13);
    }
    int *temp = (int*)malloc(sizeof(int)*scoreSize);
    memcpy(temp,score,sizeof(int)*scoreSize);
    qsort(temp,scoreSize,sizeof(int),cmp);
    for(int i = 0; i < scoreSize; i++){
        for(int j = 0; j < scoreSize; j++){
            if(score[i] == temp[j]){
                if(j == scoreSize - 1){
                    sprintf(ret[i],"%s","Gold Medal");
                }
                else if(j == scoreSize - 2){
                    sprintf(ret[i],"%s","Silver Medal");
                }
                else if(j == scoreSize - 3){
                    sprintf(ret[i],"%s","Bronze Medal");
                }
                else{
                    sprintf(ret[i],"%d",scoreSize - j);
                }
            }
        }
    }
    return ret;
}

这里我做出解释

首先我们可以先定义一下函数的内容,我们可以很清楚的看到是二元数组,接下来我们分析内部的内容,是一个是得分,第二个是运动员的数量,接下来是指向整数的指针,这个长度相当于运动员的数量

接下来代码int cmp简单来说就是把qsort函数进行整数的比较,const void a,b相当于要比较的数字,如果相减返回的是-1,那么说明(int)a<(int*)b 如果相等就说明是0 如果大于那么说明是正数

接下来我们给返回的数组分配指针地址,分配内存。

ret是一个指向字符串的指针,用于存储返回的字符串数组,使用malloc函数为其分配scoreSize大小的空间

(*returnSize) 被赋值为 scoreSize,表示返回的字符串数组的长度。
为 ret 中的每个元素分配 13 个字符的内存空间,用于存储排名信息,因为最长的排名信息 "Bronze Medal" 长度为 12,再加上字符串结束符 '\0' 共 13 个字符。

temp 是一个整数数组,用于存储 score 数组的副本。使用 malloc 函数为其分配 scoreSize 个整数的内存空间。
memcpy 函数用于将 score 数组的内容复制到 temp 数组中。
qsort 函数用于对 temp 数组进行升序排序,排序的元素个数为 scoreSize,每个元素的大小为 sizeof(int),比较函数为 cmp。

外层循环遍历 score 数组,对于每个运动员的得分 score[i]。
内层循环遍历排序后的 temp 数组,找到 score[i] 在 temp 数组中的位置 j。
根据 j 的值为运动员分配对应的排名信息:
如果 j 等于 scoreSize - 1,表示该运动员得分最高,排名第一,将 "Gold Medal" 存储到 ret[i] 中。
如果 j 等于 scoreSize - 2,表示该运动员得分第二高,排名第二,将 "Silver Medal" 存储到 ret[i] 中。
如果 j 等于 scoreSize - 3,表示该运动员得分第三高,排名第三,将 "Bronze Medal" 存储到 ret[i] 中。
否则,将该运动员的排名(scoreSize - j)以整数形式存储到 ret[i] 中。

最后返回存储排名信息的字符串数组 ret。

0

评论 (0)

取消