力扣

154 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情

实在不敢相信这是一道简单题

九坤-01. 可以读通讯稿的组数

我的提交返回竞赛

  • 通过的用户数287
  • 尝试过的用户数340
  • 用户总通过次数291
  • 用户总提交次数825
  • 题目难度Easy

校运动会上,所有参赛同学身上都贴有他的参赛号码。某班参赛同学的号码记于数组 nums 中。假定反转后的号码称为原数字的「镜像号码」。如果 两位同学 满足条件:镜像号码 A + 原号码 B = 镜像号码 B + 原号码 A,则这两位同学可以到广播站兑换一次读通讯稿的机会,为同班同学加油助威。请返回所有参赛同学可以组成的可以读通讯稿的组数,并将结果对10^9+7取余。

注意:

  1. 镜像号码中如存在前置零,则忽略前置零。
  2. 同一位同学可有多次兑换机会。

示例 1:

输入:nums = [17,28,39,71]

输出:3

解释:
共有三对同学,分别为 [17,28]、[17,39]、[28,39]。其中:
第一对同学:17 + 82 = 71 + 28;
第二对同学:17 + 93 = 71 + 39;
第三对同学:28 + 93 = 82 + 39。

示例 2:

输入:nums = [71, 60]

输出:1

解释:
共有一对同学,为 [71, 60]。
因为 71 + 6 = 17 + 60,此处 60 的镜像号码为 6,前导零被忽略。

代码:

class Solution {
public:
    int re(int num) {
        int sum = 0;
        while (num) {
            sum = sum * 10 + num % 10;
            num /= 10;
        }
        return sum;
    }
    int numberOfPairs(vector<int>& nums) {
    unordered_map<long long, long long> hash;
    for (int i = 0; i < nums.size(); i++) {
        int m = re(nums[i]);
        int sum = nums[i] - m;
        hash[sum]++;
    }
        long long res = 0;
    for (auto it = hash.begin(); it != hash.end(); it++) {
        if (it->second >= 1) {
            res += it->second * (it->second - 1) / 2 % 1000000007;
        }
    }
        return res;
    }
};

这道题感觉不错

九坤-03. 数字默契考验

我的提交返回竞赛

  • 通过的用户数225
  • 尝试过的用户数278
  • 用户总通过次数236
  • 用户总提交次数535
  • 题目难度Medium

某数学兴趣小组有 N 位同学,编号为 0 ~ N-1,老师提议举行一个数字默契小测试:首先每位同学想出一个数字,按同学编号存于数组 numbers。每位同学可以选择将自己的数字进行放大操作,每次在以下操作中任选一种(放大操作不限次数,可以不操作):

  1. 将自己的数字乘以 2
  2. 将自己的数字乘以 3

若最终所有同学可以通过操作得到相等数字,则返回所有同学的最少操作次数总数;否则请返回 -1。

 

示例 1:

输入:numbers = [50, 75, 100]
输出:5
解释:
numbers[0] * 2 * 3 = 300 操作两次;
numbers[1] * 2 * 2 = 300 操作两次;
numbers[2] * 3 = 300 操作一次。共计操作五次。

示例 2:

输入:numbers = [10, 14]
输出:-1
解释:无法通过操作得到相同数字。

代码:

class Solution {
public:
    bool f = 1;
    long check(long x){
        long ans=0;
        while (x%3==0){
            x/=3;
            ans++;
        }
        while (x%2==0){
            x/=2;
            ans++;
        }
        if (x!=1) f=0;
        return ans;
    }
    int minOperations(vector<int> &numbers)
    {
        // 0-N-1
        //*=2
        //*=3
        //找numbers数组的最大公因数

        long long  lcmNum = 1;
        long long ans = 0;
        for (int i = 0; i < numbers.size(); i++)
        {
            lcmNum = lcm(lcmNum, (long long)numbers[i]);
            ans = max(lcmNum, ans);
        }
        
        int c = 0;
        for (int i = 0; i < numbers.size(); i++) {
            long long s = ans / numbers[i];
            c += check(s);
            if (!f) return -1;
        }
        return c;
       
    }
};