Leetcode -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 位运动员的获奖情况。

示例 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] 。

思路是重新创建一个数组tmp,将原数组中的元素拷贝到tmp数组,将tmp数组升序排序,然后定义两个指针 i 和 j ,i 从tmp的尾部开始遍历数组,j 从原数组的头开始,遇到相同的得分就返回对应的名次,这时候 j 是同步原数组与返回数组的下标的,注意要特殊处理第一第二第三名;

代码语言:javascript复制 int compare(void* p1, void* p2)

{

return *(int*)p1 - *(int*)p2;

}

char** findRelativeRanks(int* score, int scoreSize, int* returnSize)

{

//将score数组中的内容拷贝到tmp数组中,利用tmp数组进行排序

int* tmp = (int*)malloc(sizeof(int) * scoreSize);

memcpy(tmp, score, sizeof(int) * scoreSize);

qsort(tmp, scoreSize, sizeof(int), compare);

//返回的数组指针

char** ret = (char**)malloc(sizeof(char*) * scoreSize);

*returnSize = scoreSize;

//i指针遍历tmp数组,从最后开始遍历,因为排序完是升序,最后一个元素最大

for (int i = scoreSize - 1; i >= 0; i--)

{

//j指针遍历原数组,因为原数组中的得分要对应返回数组的名次,所以j要同步原数组与返回数组的下标

for (int j = 0; j < scoreSize; j++)

{

//找到对应的分数

if (tmp[i] == score[j])

{

//数组指针中存放的字符串,Silver Medal与Bronze Medal的长度最长,按最长的长度开辟空间

ret[j] = (char*)malloc(sizeof(char) * 13);

//先给第一第二第三名拷贝对应字符串进数组

if (i == scoreSize - 1)

strcpy(ret[j], "Gold Medal");

else if (i == scoreSize - 2)

strcpy(ret[j], "Silver Medal");

else if (i == scoreSize - 3)

strcpy(ret[j], "Bronze Medal");

//对应的分数就将其转换成字符串再放入数组

else

sprintf(ret[j], "%d", scoreSize - i);

}

}

}

return ret;

}Leetcode - 507.完美数题目:对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。

给定一个 整数 n, 如果是完美数,返回 true;否则返回 false。

示例 1:

输入:num = 28

输出:true

解释:28 = 1 + 2 + 4 + 7 + 14

1, 2, 4, 7, 和 14 是 28 的所有正因子。

示例 2:

输入:num = 7

输出:false

思路是遍历2到sqrt(num)的数字,因为如果num有一个大于sqrt(num)的正因子,必定也会有一个小于sqrt(num)的正因子,就避免重复遍历;将所有正因子累加起来,最后判断是否与num相等;

代码语言:javascript复制 bool checkPerfectNumber(int num)

{

if (num == 1)

return false;

//将ans初始化为1,因为1与自身也是正因子,除了自身之后,还有1,把这个1算进去

int ans = 1;

//因为已经有1了,所以从2开始遍历

//只遍历到sqrt(num)的原因是,如果num有一个大于sqrt(num)的正因子,必定也会有一个小于sqrt(num)的正因子

for (int i = 2; i <= sqrt(num); i++)

{

//如果num可以整除i,就说明i是一个正因子;还有一个对应的正因子是num / i,加到ans中

if (num % i == 0)

{

ans += i;

ans += num / i;

}

}

//返回ans是否等于num

return ans == num;

}