这个题花费了我一些时间,最后发现原来是题理解错了,还是要注意审题。
-
数位差的概念(按题意理解):是指两个数字的相同数位上不同数字的个数,而不是它们数值上的差值。这意味着我们在每个位上比较,如果两个数在该位的数字不同,就记为一个“数位差”。
-
绝对差:是两个数之间的数学差值,计算方式是用一个数减去另一个数的绝对值,这跟数位差的定义不一样。
我把数位差当成两个不同数之差了,浪费了大量时间。
题目
你有一个数组 nums
,它只包含 正 整数,所有正整数的数位长度都 相同 。
两个整数的 数位差 指的是两个整数 相同 位置上不同数字的数目。
请你返回 nums
中 所有 整数对里,数位差之和。
示例 1:
输入:nums = [13,23,12]
输出:4
解释:
计算过程如下:
- 13 和 23 的数位差为 1 。
- 13 和 12 的数位差为 1 。
- 23 和 12 的数位差为 2 。
所以所有整数数对的数位差之和为 1 + 1 + 2 = 4
。
思路
- 按位处理:
- 对每一个数的各个数位(个位、十位、百位……)分别处理,统计每个数位上出现的数字。
- 统计不同数对的个数:
- 使用一个长度为 10 的数组
cnt
来统计当前数位上每个数字(0 到 9)出现的次数。 - 遍历数组
nums
时,对于每个数字d
,前面已经遍历过的数字有k
个,其中cnt[d]
个数字与当前数字d
相同,因此有k - cnt[d]
个数与d
不相同,这些都是我们需要统计的不同数对。
- 使用一个长度为 10 的数组
- 逐位累加:
- 对每一个数位,计算不同数对的个数,并将结果累加。
代码
class Solution:
def sumDigitDifferences(self, nums: List[int]) -> int:
n = len(nums)
result = 0 # 最终的不同数对的个数总和
max_length = len(str(nums[0])) # 数字的位数长度,假设所有数字位数相同
# 枚举每一个数位
for digit_pos in range(max_length):
cnt = [0] * 10 # 记录当前数位上每个数字出现的次数
# 遍历 nums,统计当前数位的数字并计算不同数对
for k in range(n):
# 提取当前数的第 digit_pos 位
current_digit = (nums[k] // (10 ** digit_pos)) % 10
# 计算不同数对:前面有 k 个数字,其中有 cnt[current_digit] 个是相同的
result += k - cnt[current_digit]
# 记录当前数位的数字出现次数
cnt[current_digit] += 1
return result