题目描述:
给你一个长度为
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" }; //初始化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; }