📅  最后修改于: 2023-12-03 15:10:21.593000             🧑  作者: Mango
给定一个由整数组成的数组A
,请你计算数组中有多少个独特的对(i, j)
,使得A[i] + A[j]
是一个回文数
,并且i < j
。两个元素构成的回文数是指第一个数字反转后与第二个数字相等。
输入: [1, 2, 3, 4, 5]
输出: 2
解释: 有两个独特的对 (i, j),它们构成回文数:(i=0, j=4) 和 (i=1, j=3)
首先,我们需要明确什么是回文数。回文数是一个正序和倒序读都相同的整数。根据这个定义,我们可以将两个数相加后判断是否为回文数。但是这样的做法时间复杂度过高,无法满足时间的需求。
考虑到回文数是对称的,我们可以取一个回文数的左半部分,将其按照降序排列,来构造回文数中的右半部分。这样设计出的回文数就不需要判断是否为回文数了。
使用哈希表来记录出现的数字,然后枚举左半部分,计算右半部分是否在哈希表中出现,即可得出答案。
def countPalindromicPairs(nums) -> int:
res = 0
dic = {}
n = len(nums)
for i in range(n):
dic[nums[i]] = i
for i in range(n):
num = str(nums[i])[::-1]
m = len(num)
for j in range(m + 1):
left = num[:j]
right = num[j:]
if left in dic and dic[left] != i and right == right[::-1]:
res += 1
if j != m and right in dic and dic[right] != i and left == left[::-1]:
res += 1
return res//2
本题是一道比较有意思的哈希表应用题目,通过了解哈希表的特性,我们可以在常数时间内查找出数字是否出现过,并且解决了在给定时间复杂度内无法解决回文数问题的难题,同时通过优化代码和空间,减轻时间的负担,达到了快速解决问题的目的。