首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >2025-10-21:两个数字的最大乘积。用go语言,给定一个正整数 n,从它的各个位上选出两个数字相乘,求能得到的最大乘积并返

2025-10-21:两个数字的最大乘积。用go语言,给定一个正整数 n,从它的各个位上选出两个数字相乘,求能得到的最大乘积并返

作者头像
福大大架构师每日一题
发布2025-12-18 15:42:38
发布2025-12-18 15:42:38
810
举报

2025-10-21:两个数字的最大乘积。用go语言,给定一个正整数 n,从它的各个位上选出两个数字相乘,求能得到的最大乘积并返回。

若某个数字在 n 中出现不止一次,则可以把该数字多次作为乘数使用。

10 <= n <= 1000000000。

输入: n = 124。

输出: 8。

解释:

n 的数字是 [1, 2, 4]。

任意两位数字相乘的结果为:1 * 2 = 2, 1 * 4 = 4, 2 * 4 = 8。

最大乘积为 8。

题目来自力扣3536。

1. 代码逻辑步骤

步骤 1:初始化两个变量

  • mx 表示遍历过程中遇到的最大数字,初始为 0。
  • mx2 表示遍历过程中遇到的第二大的数字,初始为 0。

步骤 2:循环分解数字

  • • 使用 for ; n > 0; n /= 10 循环,每次取 n % 10 得到最低位的数字 d
  • • 然后 n = n / 10 去掉最低位,直到 n 变为 0。

步骤 3:更新最大值和第二大值

对于每一位数字 d

  1. 1. 如果 d > mx
    • • 将当前 mx 的值赋给 mx2(因为原来的最大值变成第二大值)。
    • • 将 d 赋给 mx(更新最大值)。
  2. 2. 否则,如果 d > mx2d <= mx
    • • 将 d 赋给 mx2(更新第二大值)。
  3. 3. 其他情况(d <= mx2)则忽略。

步骤 4:循环结束后的处理

  • • 循环结束后,mxn 中所有数字的最大值,mx2n 中所有数字的第二大值。
  • • 因为题目允许重复使用同一个数字(只要该数字在 n 中出现过至少两次),所以最大乘积就是 mx * mx2
  • • 如果 n 中所有数字都相同(比如 n = 999),那么 mxmx2 最终会是同一个数字(因为第一次遇到 9 时 mx=9, mx2=0,后面再遇到 9 时,不满足 d > mx,但满足 d > mx2 吗?注意 mx2 初始为 0,第二次遇到 9 时,9 > 0,所以 mx2 也会更新为 9,最终两个都是 9),所以能正确得到最大乘积。

步骤 5:举例验证

n = 124 为例:

  • • 初始:mx = 0, mx2 = 0
  • • 第一次循环:d = 4 4 > 0 → mx2 = 0, mx = 4
  • • 第二次循环:d = 2 2 < 4 但 2 > 0 → mx2 = 2
  • • 第三次循环:d = 1 1 < 4 且 1 < 2 → 不更新
  • • 结果:mx = 4, mx2 = 2 乘积 = 4 × 2 = 8 ✅

2. 时间复杂度

  • • 循环次数等于 n 的十进制位数,设位数为 k,则 k = O(log n)
  • • 每次循环是常数时间操作。
  • 总时间复杂度O(log n)

3. 空间复杂度

  • • 只使用了固定数量的整型变量(mx, mx2, d 等),与输入规模无关。
  • 总额外空间复杂度O(1)

总结:该算法通过一次遍历数字的每一位,维护最大值和第二大值,最终将它们的乘积作为答案,时间效率和空间效率都非常高。

Go完整代码如下:

.

代码语言:javascript
复制
package main

import (
    "fmt"
)

func maxProduct(n int)int {
    mx, mx2 := 0, 0
    for ; n > 0; n /= 10 {
        d := n % 10
        if d > mx {
            mx2 = mx
            mx = d
        } elseif d > mx2 {
            mx2 = d
        }
    }
    return mx * mx2
}

func main() {
    n := 124
    result := maxProduct(n)
    fmt.Println(result)
}

Python完整代码如下:

.

代码语言:javascript
复制
# -*-coding:utf-8-*-

def max_product(n: int) -> int:
    mx, mx2 = 0, 0
    while n > 0:
        d = n % 10
        if d > mx:
            mx2 = mx
            mx = d
        elif d > mx2:
            mx2 = d
        n //= 10
    return mx * mx2

def main():
    n = 124
    result = max_product(n)
    print(result)

if __name__ == "__main__":
    main()

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 代码逻辑步骤
    • 步骤 1:初始化两个变量
    • 步骤 2:循环分解数字
    • 步骤 3:更新最大值和第二大值
    • 步骤 4:循环结束后的处理
    • 步骤 5:举例验证
  • 2. 时间复杂度
  • 3. 空间复杂度
  • Go完整代码如下:
  • Python完整代码如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档