Leetcode Link: 可以读通讯稿的组数 - 力扣 (LeetCode) 竞赛
题目

解法一
思路: 假设原始数字为 A 和 B,其对应的镜像为 A’和 B’
本题的约束是找到所有 A 和 B 的组合,满足 直接决解问题会非常复杂,故对公式进行变换,有 即问题等价于找到所有 A 和 B 的组合,满足两者自身减去自身的镜像的结果相等。
解决等价问题的步骤为
- 求解镜像数组,并创建字典用来计数,
key=自身减去镜像的差,value=个数 - 计算所有数字自身减镜像的值存入字典
- 每个key下的所有个数都可以两两组成一对,计算结果即可
题解:
class Solution:
def numberOfPairs(self, nums: List[int]) -> int:
dd = defaultdict(int)
# 取镜像
mirror = [int(str(x)[::-1]) for x in nums]
# 计算所有的 A-A' 的值
for a, a_ in zip(nums, mirror):
dd[a-a_] += 1
# 计算结果,两两一对。
res = 0
for k, v in dd.items():
res += v * (v-1) / 2
return int(res) % (10**9+7)