2026-10-07:最大数字范围的整数之和。用go语言,给定一个整数数组 nums。对于其中任意整数,先看它十进制表示中的各个数字,取其中最大

网易专栏1周前发布 admin
10 0 0

🤖 AI总结

主题

力扣3982题:最大数字范围整数之和的算法实现。

摘要

给定整数数组,计算各数位跨度,找出最大跨度并累加对应整数,返回总和,附多语言实现。

关键信息

  • 1 计算每个整数的数位跨度(最大数字减最小数字)。
  • 2 找出最大跨度并累加所有跨度等于该值的整数。
  • 3 提供Go、Python、C++多语言代码实现。

2026-10-07:最大数字范围的整数之和。用go语言,给定一个整数数组 nums。对于其中任意整数,先看它十进制表示中的各个数字,取其中最大值与最小值,二者相减得到一个差值,可称为该整数的数位跨度。接着在 nums 里比较每个整数的数位跨度,找到最大的那个跨度值。最后,把 nums 中所有数位跨度正好等于这个最大值的整数相加,并返回这个总和。

比如 5724 中的数字最大为 7、最小为 2,因此它的数位跨度为 5。

1 <= nums.length <= 100。

10 <= nums[i] <= 100000。

输入: nums = [5724,111,350]。

输出: 6074。

解释:

i

nums[i]

最大数字

最小数字

数字范围

0

5724

7

2

5

1

111

1

1

0

2

350

5

0

5

最大数字范围为 5。数字范围为 5 的整数是 5724 和 350,因此答案为 5724 + 350 = 6074。

题目来自力扣3982。

具体过程可以分成下面几步:

1. 准备两个全局记录变量

• 一个用来记录当前已经遇到过的最大数位跨度,初始可以看成 0。

  • • 一个用来记录“当前最大数位跨度对应的所有整数之和”,初始为 0。
    注意:这个和不是最终答案,因为后面如果遇到更大的数位跨度,之前的累加就要作废,重新开始累加。

    2. 依次遍历数组中的每一个整数
    对每个整数,都要先单独计算它的数位跨度。

    3. 计算一个整数的数位跨度

    • 先准备两个临时变量:一个表示当前见过的最小数字,一个表示当前见过的最大数字。

  • • 由于十进制数字范围是 0 到 9,所以最小数字可以先设为一个较大的值,最大数字可以先设为一个较小的值,方便后续更新。

  • • 然后不断取出这个整数的最后一位数字:

  • • 用这个数字去更新最小数字,取更小的那个。

  • • 用这个数字去更新最大数字,取更大的那个。

  • • 然后把整数去掉最后一位,继续取新的最后一位。

  • • 当所有位都取完后,最大数字减去最小数字,就得到这个整数的数位跨度。

    4. 把当前整数的数位跨度和全局最大数位跨度比较
    比较结果有三种情况:

    • 第一种:当前数位跨度比之前记录的最大数位跨度还大。
    这说明找到了新的最大跨度。
    此时之前累加的那些整数全部无效,因为最终只关心最大跨度对应的整数。
    所以要做两件事:

    1. 更新全局最大数位跨度为当前这个更大的跨度。

  • 2. 把累加和直接重置为当前这个整数本身,而不是继续加。
    这一步很关键,相当于“重新开始累加”。

    • 第二种:当前数位跨度和之前记录的最大数位跨度相等。
    说明当前整数也属于最终要累加的对象。
    于是把当前整数加到累加和里。

    • 第三种:当前数位跨度小于之前记录的最大数位跨度。
    说明当前整数不可能是最终答案的一部分。
    直接忽略,不更新任何东西。

    5. 继续处理下一个整数
    重复第 3 步和第 4 步,直到数组中所有整数都处理完。

    6. 遍历结束后返回累加和
    此时全局最大数位跨度已经确定,并且累加和中保存的就是所有数位跨度等于该最大值的整数之和。

    以题目示例nums = [5724, 111, 350]为例:

    • 处理 5724:
    它的数字是 5、7、2、4,最大是 7,最小是 2,数位跨度是 5。
    当前全局最大跨度从 0 变成 5,累加和重置为 5724。

  • • 处理 111:
    它的数字都是 1,最大是 1,最小是 1,数位跨度是 0。
    0 小于当前最大跨度 5,所以忽略。

  • • 处理 350:
    它的数字是 3、5、0,最大是 5,最小是 0,数位跨度是 5。
    5 等于当前最大跨度 5,所以把 350 加到累加和中。
    累加和变成 5724 + 350 = 6074。

    最终返回 6074。

    复杂度分析:

    • 时间复杂度:
    外层需要遍历数组中的 n 个整数。
    对每个整数,需要拆出它的每一位十进制数字。
    设一个整数的十进制位数为 k,则每个整数需要 k 次操作。
    因此总时间是 O(n × k)。
    在题目约束下,整数最大为 100000,最多只有 6 位,所以 k 最大是 6,可以看作常数。
    因此也可以说总时间复杂度是 O(n)。

  • • 额外空间复杂度:
    算法只使用了若干个临时变量来保存当前最小值、最大值、当前跨度、全局最大跨度和累加和等。
    没有使用额外的数组、哈希表或递归栈等与输入规模相关的空间。
    因此总额外空间复杂度是 O(1)。

    Go完整代码如下:

    package main

    import (
    "fmt"
    )

    func maxDigitRange(nums []int) (ans int) {
    maxRange := 0
    for _, x := range nums {
    mn, mx := 9, 0
    for v := x; v > 0; v /= 10 {
    d := v % 10
    mn = min(mn, d)
    mx = max(mx, d)
    }

    r := mx - mn
    if r > maxRange {
    maxRange = r
    ans = x // 重新累加
    } elseif r == maxRange {
    ans += x
    }
    }
    return
    }

    func main() {
    nums := []int{5724, 111, 350}
    result := maxDigitRange(nums)
    fmt.Println(result)
    }

    2026-10-07:最大数字范围的整数之和。用go语言,给定一个整数数组 nums。对于其中任意整数,先看它十进制表示中的各个数字,取其中最大

    Python完整代码如下:

    # -*-coding:utf-8-*-

    def max_digit_range(nums):
    ans = 0
    max_range = 0

    for x in nums:
    if x == 0:
    mn = mx = 0
    else:
    mn, mx = 9, 0
    v = x
    while v > 0:
    d = v % 10
    mn = min(mn, d)
    mx = max(mx, d)
    v //= 10

    r = mx - mn

    if r > max_range:
    max_range = r
    ans = x # 重新开始累加
    elif r == max_range:
    ans += x

    return ans

    if __name__ == "__main__":
    nums = [5724, 111, 350]
    result = max_digit_range(nums)
    print(result)

    2026-10-07:最大数字范围的整数之和。用go语言,给定一个整数数组 nums。对于其中任意整数,先看它十进制表示中的各个数字,取其中最大

    C++完整代码如下:

      
    



    using namespace std;

    int maxDigitRange(const vector& nums) {
    int ans = 0;
    int maxRange = 0;

    for (int x : nums) {
    int mn = 9, mx = 0;

    for (int v = x; v > 0; v /= 10) {
    int d = v % 10;
    mn = min(mn, d);
    mx = max(mx, d);
    }

    int r = mx - mn;

    if (r > maxRange) {
    maxRange = r;
    ans = x; // 重新开始累加
    } elseif (r == maxRange) {
    ans += x;
    }
    }

    return ans;
    }

    int main() {
    vector nums = {5724, 111, 350};
    int result = maxDigitRange(nums);
    cout << result << endl;

    return0;
    }

    2026-10-07:最大数字范围的整数之和。用go语言,给定一个整数数组 nums。对于其中任意整数,先看它十进制表示中的各个数字,取其中最大

    我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

    © 版权声明

    相关文章