【Leetcode -506.相对名次 -507.完美数】

2024-03-01 09:53:01 浏览数 (2)

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;
		}

0 人点赞