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 是同步原数组与返回数组的下标的,注意要特殊处理第一第二第三名;
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相等;
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; }