
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。
mx 表示遍历过程中遇到的最大数字,初始为 0。mx2 表示遍历过程中遇到的第二大的数字,初始为 0。for ; n > 0; n /= 10 循环,每次取 n % 10 得到最低位的数字 d。n = n / 10 去掉最低位,直到 n 变为 0。对于每一位数字 d:
d > mx:mx 的值赋给 mx2(因为原来的最大值变成第二大值)。d 赋给 mx(更新最大值)。d > mx2 但 d <= mx:d 赋给 mx2(更新第二大值)。d <= mx2)则忽略。mx 是 n 中所有数字的最大值,mx2 是 n 中所有数字的第二大值。n 中出现过至少两次),所以最大乘积就是 mx * mx2。n 中所有数字都相同(比如 n = 999),那么 mx 和 mx2 最终会是同一个数字(因为第一次遇到 9 时 mx=9, mx2=0,后面再遇到 9 时,不满足 d > mx,但满足 d > mx2 吗?注意 mx2 初始为 0,第二次遇到 9 时,9 > 0,所以 mx2 也会更新为 9,最终两个都是 9),所以能正确得到最大乘积。以 n = 124 为例:
n 的十进制位数,设位数为 k,则 k = O(log n)。mx, mx2, d 等),与输入规模无关。总结:该算法通过一次遍历数字的每一位,维护最大值和第二大值,最终将它们的乘积作为答案,时间效率和空间效率都非常高。
.
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)
}

.
# -*-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助力您的未来发展。