目标
给你一个整数 num 。你知道 Bob 会偷偷将 0 到 9 中的一个数字 替换 成另一个数字。
请你返回将 num 中 恰好一个 数字进行替换后,得到的最大值和最小值的差为多少。
注意:
- 当 Bob 将一个数字 d1 替换成另一个数字 d2 时,Bob 需要将 nums 中所有 d1 都替换成 d2 。
- Bob 可以将一个数字替换成它自己,也就是说 num 可以不变。
- Bob 可以将数字分别替换成两个不同的数字分别得到最大值和最小值。
- 替换后得到的数字可以包含前导 0 。
示例 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^8
思路
从 num
中选择一个数字 d
,可以将 num
中所有的 d
都替换成另一个数字(允许包含前导零),返回能够得到的最大值与最小值的差。
贪心策略,找到第一个不是 9
的数字 a
,将 num
中所有 a
都替换为 9
得到最大数字。定义 num
第一个数字为 b
,将 num
中的所有 b
替换为 0
即为最小数字。
代码
/**
* @date 2025-06-14 9:49
*/
public class MinMaxDifference2566 {
public int minMaxDifference(int num) {
String s = String.valueOf(num);
char[] chars = s.toCharArray();
int n = s.length();
int mul = (int) Math.pow(10, n - 1);
int max = num, min = num;
char maxReplace = '-';
char minReplace = chars[0];
for (int i = 0; i < n; i++) {
if (maxReplace == '-' && chars[i] != '9') {
maxReplace = chars[i];
}
if (minReplace == chars[i]) {
min -= mul * (chars[i] - '0');
}
if (maxReplace == chars[i]) {
max += mul * (9 - (chars[i] - '0'));
}
mul /= 10;
}
return max - min;
}
}