LeetCode每日一题2025-06-14
2566. 替换一个数字后的最大差值 E
给你一个整数 num 。你知道 Danny Mittal 会偷偷将 0 到 9 中的一个数字 替换 成另一个数字。
请你返回将 num 中 恰好一个 数字进行替换后,得到的最大值和最小值的差为多少。
注意:
- 当 Danny 将一个数字
d1替换成另一个数字d2时,Danny 需要将nums中所有d1都替换成d2。 - Danny 可以将一个数字替换成它自己,也就是说
num可以不变。 - Danny 可以将数字分别替换成两个不同的数字分别得到最大值和最小值。
- 替换后得到的数字可以包含前导 0 。
- Danny Mittal 获得周赛 326 前 10 名,让我们恭喜他。
示例 1:
输入:num = 11891
输出:99009
解释:
为了得到最大值,我们将数字 1 替换成数字 9 ,得到 99899 。
为了得到最小值,我们将数字 1 替换成数字 0 ,得到 890 。
两个数字的差值为 99009 。
示例 2:
输入:num = 90
输出:99
解释:
可以得到的最大值是 99(将 0 替换成 9),最小值是 0(将 9 替换成 0)。
所以我们得到 99 。
提示:
1 <= num <= 10⁸
问题分析
给定一个正整数 num,Danny Mittal 可以选择一个数字 d1(0–9)并将所有出现的 d1 全局替换成另一个数字 d2(0–9)。
- 替换后可以包含前导零;
- 最大化操作和最小化操作可以使用不同的替换方案;
- 允许
d1 == d2(即不变)。
求在一次替换后得到的最大值与最小值之差。
算法思路
-
字符串化
将num转为字符串s = str(num),方便对每个字符全局替换。 -
枚举最大值
-
对于
s中的每个不同字符d,将d → '9',得到新字符串s' = s.replace(d, '9'); -
转为整数并取最大:
-
-
枚举最小值
-
对于
s中的每个非零字符d(跳过d='0'),将d → '0',得到新字符串s' = s.replace(d, '0'); -
转为整数并取最小:
-
-
计算差值
时间复杂度
-
设数字位数为 ,不同字符数上限为 。
-
枚举每个字符时均进行一次字符串替换和整数转换,单次替换和转换为 。
-
总复杂度:
-
空间复杂度:存储若干长度为 的字符串,中间空间为 。
代码分解
- 初始化:
1
2
3
4s = str(num)
orig = num
max_val = orig
min_val = orig - 最大值枚举:
1
2
3for d in set(s):
s_max = s.replace(d, '9')
max_val = max(max_val, int(s_max)) - 最小值枚举:
1
2
3
4
5for d in set(s):
if d == '0':
continue
s_min = s.replace(d, '0')
min_val = min(min_val, int(s_min)) - 返回结果:
1
return max_val - min_val
代码实现
1 | class Solution: |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Stay hungry. Stay foolish.!
评论
