【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
|
class Solution { public: int maximum69Number (int num) { string s = to_string(num); for (char &c : s) { if (c == '6') { c = '9'; 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))
|
Java
1 2 3 4 5 6 7 8 9 10 11
|
class Solution { public int maximum69Number (int num) { return Integer.parseInt(String.valueOf(num).replaceFirst("6", "9")); } }
|
Go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
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
|
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
|
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
|
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和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源