📜  数组中唯一对 (i, j) 的计数,使得 A[i] 和 A[j] 的反向之和等于 A[i] 和 A[j] 的反向之和(1)

📅  最后修改于: 2023-12-03 15:10:21.593000             🧑  作者: Mango

数组中唯一对 (i, j) 的计数

题目描述

给定一个由整数组成的数组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
总结

本题是一道比较有意思的哈希表应用题目,通过了解哈希表的特性,我们可以在常数时间内查找出数字是否出现过,并且解决了在给定时间复杂度内无法解决回文数问题的难题,同时通过优化代码和空间,减轻时间的负担,达到了快速解决问题的目的。