1323.6 和 9 组成的最大数字:字符串辅助或直接计算

【LetMeFly】1323.6 和 9 组成的最大数字:字符串辅助或直接计算

力扣题目链接:https://leetcode.cn/problems/maximum-69-number/

给你一个仅由数字 6 和 9 组成的正整数 num

你最多只能翻转一位数字,将 6 变成 9,或者把 9 变成 6 。

请返回你可以得到的最大数字。

 

示例 1:

输入:num = 9669
输出:9969
解释:
改变第一位数字可以得到 6669 。
改变第二位数字可以得到 9969 。
改变第三位数字可以得到 9699 。
改变第四位数字可以得到 9666 。
其中最大的数字是 9969 。

示例 2:

输入:num = 9996
输出:9999
解释:将最后一位从 6 变到 9,其结果 9999 是最大的数。

示例 3:

输入:num = 9999
输出:9999
解释:无需改变就已经是最大的数字了。

 

提示:

  • 1 <= num <= 10^4
  • num 每一位上的数字都是 6 或者 9 。

解题方法一:字符串辅助计算

这是最简单的一种方式,直接把num转为字符串,从前到后遍历字符串并将第一个6变成9,最后再转回正数。

  • 时间复杂度$O(\log_{10}num)$
  • 空间复杂度$O(\log_{10}num)$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
* @Author: LetMeFly
* @Date: 2025-08-16 10:17:15
* @LastEditors: LetMeFly.xyz
* @LastEditTime: 2025-08-16 10:19:20
*/
class Solution {
public:
int maximum69Number (int num) {
string s = to_string(num);
for (char &c : s) {
if (c == '6') {
c = '9';
break; // 记得break
}
}
return atoi(s.c_str());
}
};

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
'''
Author: LetMeFly
Date: 2025-08-16 10:17:15
LastEditors: LetMeFly.xyz
LastEditTime: 2025-08-16 10:24:13
'''
class Solution:
def maximum69Number (self, num: int) -> int:
s = list(str(num))
for i, c in enumerate(s):
if c == '6':
s[i] = '9'
break
return int(''.join(s)) # 记得转回int

Java

1
2
3
4
5
6
7
8
9
10
11
/*
* @Author: LetMeFly
* @Date: 2025-08-16 10:17:15
* @LastEditors: LetMeFly.xyz
* @LastEditTime: 2025-08-16 10:46:36
*/
class Solution {
public int maximum69Number (int num) {
return Integer.parseInt(String.valueOf(num).replaceFirst("6", "9")); // java竟然一行解决了
}
}

Go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
* @Author: LetMeFly
* @Date: 2025-08-16 10:17:15
* @LastEditors: LetMeFly.xyz
* @LastEditTime: 2025-08-16 10:43:00
*/
package main

import (
"strconv"
"strings"
)

func maximum69Number (num int) (ans int) {
s := strconv.Itoa(num)
s = strings.Replace(s, "6", "9", 1)
ans, _ = strconv.Atoi(s)
return
}

Rust

1
2
3
4
5
6
7
8
9
10
11
/*
* @Author: LetMeFly
* @Date: 2025-08-16 10:17:15
* @LastEditors: LetMeFly.xyz
* @LastEditTime: 2025-08-16 10:48:36
*/
impl Solution {
pub fn maximum69_number (num: i32) -> i32 {
num.to_string().replacen("6", "9", 1).parse().unwrap()
}
}

解题方法二:直接计算

总体思路

想要知道num十进制下的第一个6,必须把num转为字符串吗?

不需要,将num不断模10,取出十进制下的每一位,并记下第一个6的下标即可。

知道了第一个6的下标first6loc,那么将这个6变成9,num会变大多少呢?会变大($3000…=3\times 10^{first6loc}$)。

具体的num变大方法

method1

就按照上面说的方法做就行。

小优化

为了不再计算一次$10^{first6loc}$,我们也可以在循环过程中顺便算出$10^{first6loc}$。

只需要将之前的更新$first6loc$改为更新$10^{first6loc}$即可。

时空复杂度分析

  • 时间复杂度$O(\log_{10}num)$
  • 空间复杂度$O(1)$

AC代码

C++ - method1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
* @Author: LetMeFly
* @Date: 2025-08-16 10:17:15
* @LastEditors: LetMeFly.xyz
* @LastEditTime: 2025-08-16 10:30:45
*/
class Solution {
public:
int maximum69Number (int num) {
int first6loc = -1;
for (int n = num, loc = 0; n; n /= 10, loc++) {
if (n % 10 == 6) {
first6loc = loc;
}
}
if (first6loc == -1) {
return num;
}
return num + 3 * pow(10, first6loc);
}
};

C++ - 小优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
* @Author: LetMeFly
* @Date: 2025-08-16 10:17:15
* @LastEditors: LetMeFly.xyz
* @LastEditTime: 2025-08-16 10:34:19
*/
class Solution {
public:
int maximum69Number (int num) {
int base = 0;
for (int n = num, loc = 0, nowPow = 1; n; n /= 10, loc++, nowPow *= 10) {
if (n % 10 == 6) {
base = nowPow;
}
}
return num + base * 3;
}
};

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源


1323.6 和 9 组成的最大数字:字符串辅助或直接计算
https://blog.letmefly.xyz/2025/08/16/LeetCode 1323.6和9组成的最大数字/
作者
发布于
2025年8月16日
许可协议