Count Nice Pairs in an Array

medium hash map math

Problem

rev(x) reverses x's digits. Count pairs (i, j) with i

Inputnums = [42,11,1,97]
Output2
(0,3): 42+79 = 97+24 = 121; (1,2): 11+1 = 1+11.

def count_nice_pairs(nums):
    MOD = 10**9 + 7
    from collections import Counter
    def rev(x): return int(str(x)[::-1])
    cnt = Counter()
    ans = 0
    for x in nums:
        k = x - rev(x)
        ans = (ans + cnt[k]) % MOD
        cnt[k] += 1
    return ans
function countNicePairs(nums) {
  const MOD = 1000000007n;
  const cnt = new Map();
  let ans = 0n;
  function rev(x) { return parseInt(String(x).split('').reverse().join(''), 10); }
  for (const x of nums) {
    const k = x - rev(x);
    ans = (ans + BigInt(cnt.get(k) || 0)) % MOD;
    cnt.set(k, (cnt.get(k) || 0) + 1);
  }
  return Number(ans);
}
class Solution {
    int rev(int x) { int r = 0; while (x > 0) { r = r * 10 + x % 10; x /= 10; } return r; }
    public int countNicePairs(int[] nums) {
        long MOD = 1_000_000_007L, ans = 0;
        Map<Integer, Integer> cnt = new HashMap<>();
        for (int x : nums) {
            int k = x - rev(x);
            ans = (ans + cnt.getOrDefault(k, 0)) % MOD;
            cnt.merge(k, 1, Integer::sum);
        }
        return (int) ans;
    }
}
int rev(int x) { int r = 0; while (x > 0) { r = r * 10 + x % 10; x /= 10; } return r; }
int countNicePairs(vector<int>& nums) {
    const long MOD = 1000000007;
    unordered_map<int,int> cnt;
    long ans = 0;
    for (int x : nums) {
        int k = x - rev(x);
        ans = (ans + cnt[k]) % MOD;
        cnt[k]++;
    }
    return (int) ans;
}
Time: O(n) Space: O(n)