文章目录
- 题目描述
- 题目链接
- 题目难度——简单
- 方法一:替换
- 代码/Python
- 代码优化
- 总结
题目描述
给你一个整数 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 <= 108
题目链接
题目难度——简单
方法一:替换
直觉来看,为了得到最大值,我们可以从左往右依次从高位看向地位,把第一个非9数字以及后面的相同数字替换为9就能得到最大值。同样,为了得到最小值,我们可以直接把最高位以及后面和最高位相同的数字都替换为0,就能得到最小值。这样做的前提是本题可以有前导0的存在。
代码/Python
class Solution:
def minMaxDifference(self, num: int) -> int:
nums = [int(x) for x in str(num)]
tmp = nums.copy()
tag = 0
for n in nums:
if n < 9:
tag = n
break
nums = [9 if x == tag else x for x in nums]
tag = 0
for n in tmp:
if n > 0:
tag = n
break
tmp = [0 if x == tag else x for x in tmp]
max_num = int(''.join([str(x) for x in nums]))
min_num = int(''.join([str(x) for x in tmp]))
return max_num - min_num
再多看一眼代码,就会爆炸 ,可以发现有很多可以优化的地方,比如没必要一开始把原数转换成数字列表,完全可以直接用字符串,第二次的循环也没必要。优化一下,就变成:
代码优化
class Solution:
def minMaxDifference(self, num: int) -> int:
nums = str(num)
tag = '0'
for n in nums:
if n < '9':
tag = n
break
maxx = nums.replace(tag, '9')
minn = nums.replace(nums[0], '0')
return int(maxx) - int(minn)
总结
方法一时间复杂度O(N),空间复杂度O(N)。