type
status
date
slug
summary
tags
category
icon
password
题目
给你一个数组
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
取余 后返回。示例 1:
输入:nums = [42,11,1,97]
输出:2
解释:两个坐标对为:
- (0,3):42 + rev(97) = 42 + 79 = 121, 97 + rev(42) = 97 + 24 = 121 。
- (1,2):11 + rev(1) = 11 + 1 = 12, 1 + rev(11) = 1 + 11 = 12 。
示例 2:
输入:nums = [13,10,35,24,76]
输出:4
提示:
1 <= nums.length <= 105
0 <= nums[i] <= 109
Related Topics
- 数组
- 哈希表
- 数学
- 计数
思路
为了解决这个问题,我们需要理解一下题目的要求。题目中的条件是:
nums[i] + rev(nums[j]) = nums[j] + rev(nums[i])
我们可以对条件进行一些变形来简化问题:
nums[i] − rev(nums[i]) = nums[j] − rev(nums[j])
这个转换说明,要使得上面的等式成立,对于任何两个数
nums[i]
和 nums[j]
,它们的差值减去其反转数字的差值必须相等。我们可以使用哈希表来跟踪每个差值出现的次数。当一个特定的差值出现多次时,我们可以通过组合学来计算可以形成多少对符合条件的 (i, j)
。具体步骤:
1. 计算每个数字与其反转之差。
2. 将这些差值存储在哈希表中,统计每个差值的频率。
3. 对于哈希表中的每个条目,如果一个差值出现了
k
次,那么可以形成的好对数为 $\frac{k \times (k-1)}{2}$。现在我们可以将上述逻辑编码成 Java 解决方案:
这个解法首先定义了一个
reverse
辅助函数来获取数字的反转。然后通过哈希表来记录差值和其频率,最后通过数学公式计算结果。这种方法在时间复杂度上是线性的,即 O(n),其中 n 是数组 nums
的长度,因为每个元素只被处理一次。总结
我自己参照GPT的答案写了一个版本
不同点在于这里:
我多加了括号,但是没有通过。
### 为什么括号会导致错误
为了更好地理解这个问题,让我们考虑具体的数值计算:
假设
num = 100000
,那么:- 第一个代码片段:
- 第二个代码片段:
getOrDefault()函数在hashmap中要会用
- 作者:Sissi
- 链接:https://notion-next-fsof.vercel.app//article/array
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。