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

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

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;
    }
目录
相关文章
|
6月前
leetcode-506:相对名次
leetcode-506:相对名次
61 0
【Leetcode -1609.奇偶树 -1122.数组的相对排序】
【Leetcode -1609.奇偶树 -1122.数组的相对排序】
48 0
|
6月前
leetcode:506. 相对名次
leetcode:506. 相对名次
41 0
|
索引
力扣 506.相对名词 纯C解法
力扣 506.相对名词 纯C解法
【每日一题】力扣剑指 Offer II 075. 数组相对排序
【每日一题】力扣剑指 Offer II 075. 数组相对排序
【每日一题】力扣剑指 Offer II 075. 数组相对排序
|
索引
力扣刷题记录——496. 下一个更大元素 I、500. 键盘行、506. 相对名次
力扣刷题记录——496. 下一个更大元素 I、500. 键盘行、506. 相对名次
107 0
力扣刷题记录——496. 下一个更大元素 I、500. 键盘行、506. 相对名次
LeetCode 1122. 数组的相对排序
给你两个数组,arr1 和 arr2,arr2 中的元素各不相同 arr2 中的每个元素都出现在 arr1 中 对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。
105 0
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行