【每日一题/C++】LeetCode 2037.使每位学生都有座位的最少移动次数


📝我的个人主页
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊
✉️今天你做别人不想做的事,明天你就能做别人做不到的事♐


一、题目描述

给你一个数组 nums ,数组中只包含非负整数。定义 rev(x) 的值为将整数 x 各个数字位反转得到的结果。比方说 rev(123) = 321 , rev(120) = 21 。我们称满足下面条件的下标对 (i, j) 是 好的

  • 0 <= i < j < nums.length
  • nums[i] + rev(nums[j]) == nums[j] +rev(nums[i])

请你返回好下标对的数目。由于结果可能会很大,请将结果对 1 0 9 10^{9} 109+ 7 取余 后返回。

二、解题思路

反转整数 x 各个数字位并不难,难的是要想到将nums[i] + rev(nums[j]) == nums[j] +rev(nums[i])转化为nums[i]−rev(nums[i])=nums[j]−rev(nums[j])

因此,我们可以将 nums[i] - rev(nums[i])nums[i]−rev(nums[i]) 作为哈希表的键,统计每个键出现的次数。最后计算每个键对应的值的组合数,相加得到最终的答案。

三、AC代码

class Solution {
public:
    int countNicePairs(vector<int>& nums) {
         unordered_map<int, int> cnt;
        int ans = 0;
        const int mod = 1e9 + 7;
        for (int& x : nums) {
            int y = x - rev(x);
            ans = (ans + cnt[y]++) % mod;
        }
        return ans;
    }
    int rev(int x){
        int ans=0,temp;
        while(x){
            temp=x%10;
            x=(x-temp)/10;
            ans=ans*10+temp;
        }
        return ans;
    }
};

四、知识点总结

unordered_map<int, int> cnt;    
for (auto& [_, v] : cnt) {        //遍历cnt中的值

	//1ll意思是long long,是为了将int转化为long long
	ans = (ans + 1ll * v * (v - 1) / 2) % mod;     
}
  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习的小马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值