2025-10-21:两个数字的最大乘积。用go语言,给定一个正整数 n,从它的各个位上选出两个数字相乘,求能得到的最大乘积并返
【摘要】 2025-10-21:两个数字的最大乘积。用go语言,给定一个正整数 n,从它的各个位上选出两个数字相乘,求能得到的最大乘积并返回。若某个数字在 n 中出现不止一次,则可以把该数字多次作为乘数使用。10 <= n <= 1000000000。输入: n = 124。输出: 8。解释:n 的数字是 [1, 2, 4]。任意两位数字相乘的结果为:1 * 2 = 2, 1 * 4 = 4, 2 *...
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:
- 如果
d > mx:- 将当前
mx的值赋给mx2(因为原来的最大值变成第二大值)。 - 将
d赋给mx(更新最大值)。
- 将当前
- 否则,如果
d > mx2但d <= mx:- 将
d赋给mx2(更新第二大值)。
- 将
- 其他情况(
d <= mx2)则忽略。
步骤 4:循环结束后的处理
- 循环结束后,
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),所以能正确得到最大乘积。
步骤 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完整代码如下:
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
} else if d > mx2 {
mx2 = d
}
}
return mx * mx2
}
func main() {
n := 124
result := maxProduct(n)
fmt.Println(result)
}

Python完整代码如下:
# -*-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()

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)