题目描述:
给你一个长度为
n
的整数数组score
,其中score[i]
是第i
位运动员在比赛中的得分。所有得分都 互不相同 。运动员将根据得分 决定名次 ,其中名次第
1
的运动员得分最高,名次第2
的运动员得分第2
高,依此类推。运动员的名次决定了他们的获奖情况:
- 名次第
1
的运动员获金牌"Gold Medal"
。- 名次第
2
的运动员获银牌"Silver Medal"
。- 名次第
3
的运动员获铜牌"Bronze Medal"
。- 从名次第
4
到第n
的运动员,只能获得他们的名次编号(即,名次第x
的运动员获得编号"x"
)。
思路:
创建一个结构体数组保存选手的分数和索引值
对结构体数组进行排序
依次遍历所有选手,前三名获奖,其他只获得名词
图解:
代码:
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" };//初始化ansfor (int i = 0; i < scoreSize; i++) {char* tmp = (char*)malloc(sizeof(char) * 13);ans[i] = tmp;}for (int i = 0; i = 3) {ans[t[i].index] = toString(i + 1);}else {ans[t[i].index] = desc[i];}}return ans;}