前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Leetcode -506.相对名次 -507.完美数】

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

作者头像
YoungMLet
发布2024-03-01 09:53:01
670
发布2024-03-01 09:53:01
举报
文章被收录于专栏:C++/Linux

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;
		}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Leetcode -506.相对名次
  • Leetcode - 507.完美数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档