1814. 统计一个数组中好对子的数目

85 阅读1分钟

题目:
给你一个数组 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])

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

算法:
方法一: hash表
nums[i] + rev(nums[j]) == nums[j] + rev(nums[i])改写为: nums[i] - rev(nums[i]) == nums[j] - rev(nums[j]) ,用hash表保存满足nums[i] - rev(nums[i])的数的个数,最后用排列组合公式计算即可。

func countNicePairs(nums []int) int {
    m := make(map[int]int, 0)
    mod := 1000000007
    for i := range nums {
        m[nums[i] - rev(nums[i])] ++
    }
    ans := 0
    for _, cnt := range m {
        if cnt > 1 {
            ans = (ans + cnt * (cnt - 1) / 2 % mod) %  mod
        }
    }
    return ans
}

func rev(num int) int {
    ans := 0
    for num > 0 {
        ans = ans * 10 + num % 10
        num = num / 10
    }
    return ans
}