[leetcode刷题]力扣刷题6之所以数对中数位差之和(中等)

这个题花费了我一些时间,最后发现原来是题理解错了,还是要注意审题。

  • 数位差的概念(按题意理解):是指两个数字的相同数位上不同数字的个数,而不是它们数值上的差值。这意味着我们在每个位上比较,如果两个数在该位的数字不同,就记为一个“数位差”。

  • 绝对差:是两个数之间的数学差值,计算方式是用一个数减去另一个数的绝对值,这跟数位差的定义不一样。

我把数位差当成两个不同数之差了,浪费了大量时间。

题目

你有一个数组 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 不相同,这些都是我们需要统计的不同数对。
  • 逐位累加
    • 对每一个数位,计算不同数对的个数,并将结果累加。

代码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值