一、题目描述
给你一个数组 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;
}