力扣 506.相对名词 纯C解法

题目描述:

给你一个长度为 n 的整数数组 score ,其中 score[i] 是第 i 位运动员在比赛中的得分。所有得分都 互不相同

运动员将根据得分 决定名次 ,其中名次第 1 的运动员得分最高,名次第 2 的运动员得分第 2 高,依此类推。运动员的名次决定了他们的获奖情况:

  • 名次第 1 的运动员获金牌 "Gold Medal"
  • 名次第 2 的运动员获银牌 "Silver Medal"
  • 名次第 3 的运动员获铜牌 "Bronze Medal"
  • 从名次第 4 到第 n 的运动员,只能获得他们的名次编号(即,名次第 x 的运动员获得编号 "x")。

思路:

创建一个结构体数组保存选手的分数和索引值

对结构体数组进行排序

依次遍历所有选手,前三名获奖,其他只获得名词

图解:

力扣 506.相对名词 纯C解法_第1张图片 

代码:

typedef struct table {
    int score;//分数
    int index;//分数所在的索引
}table;
int cmp1(const void* a, const void* b) {
    return ((table*)b)->score - ((table*)a)->score;
}

char* toString(int val) {
    char* arr = (char*)malloc(sizeof(char) * 13);
    int top = 0;
    while (val > 0) {
        int num = val % 10;
        val /= 10;
        arr[top++] = num + '0';
    }
    arr[top] = 0;
    int left = 0, right = top - 1;
    // 翻转字符串
    while (left < right) {
        int tmp = arr[left];
        arr[left++] = arr[right];
        arr[right--] = tmp;
    }
    return arr;
}

char** findRelativeRanks(int* score, int scoreSize, int* returnSize) {
    (*returnSize) = scoreSize;
    //创建Hash表
    table* t = (table*)malloc(sizeof(table) * scoreSize);
    int top = 0;
    //初始化hash表
    for (int i = 0; i < scoreSize; i++) {
        t[i].score = score[i];
        t[i].index = i;
    }
    //对hash表降序排序,得出名次表
    qsort(t, scoreSize, sizeof(t[0]), cmp1);

    char** ans = malloc(sizeof(char*) * scoreSize);
    char* desc[] = { "Gold Medal", "Silver Medal", "Bronze Medal" };
    //初始化ans
    for (int i = 0; i < scoreSize; i++) {
        char* tmp = (char*)malloc(sizeof(char) * 13);
        ans[i] = tmp;
    }
    for (int i = 0; i < scoreSize; i++) {
        char* tmp = (char*)malloc(sizeof(char) * 13);
        if (i >= 3) {
            ans[t[i].index] = toString(i + 1);
        }
        else {
            ans[t[i].index] = desc[i];
        }
    }
    return ans;
}

你可能感兴趣的:(leetcode,leetcode,数据结构,算法)