1814. Count Nice Pairs in an Array
给你一串阵列
阵列里面都是正整数
然后有一个颠倒数rev
例如123的颠倒数rev(123)是321
120的颠倒数rev(120)是21
有两个数a,b
如果rev(a) + b = a + rev(b)
则a与b则可以配成一对
求阵列内的数可能配对的数量
Intuition:
这一题我原本想的思路是错的
写半天解决了大部分的case之后有少数case没办法找出来
Approach:
我们透过交换率可以知道
rev(a) + b = a + rev(b) => a - rev(a) = b - rev(b)
所以只要两个数
他们和自己的颠倒数差相等就可以配一对
我们只要用map把所有颠倒数差相等的放一起
然后Cn取2就后累加就能得到答案
TS Code:
const mod = 1000000007
function getReverse (num: number): number {
const n = num
let reverse = 0
while (num > 0) {
reverse *= 10
reverse += num % 10
num = Math.floor(num / 10)
}
return reverse
}
function countNicePairs (nums: number[]): number {
const diffMap = new Map<number, number>()
for (let i = 0; i < nums.length; i++) {
const diff = getReverse(nums[i]) - nums[i]
diffMap.set(diff, (diffMap.get(diff) ?? 0) + 1)
}
let result = 0
for (const value of diffMap.values()) {
result = (result + value * (value - 1) / 2) % mod
}
return result
}