目标
给你一个整数 num 。你可以对它进行以下步骤共计 两次:
- 选择一个数字 x (0 <= x <= 9).
- 选择另一个数字 y (0 <= y <= 9) 。数字 y 可以等于 x 。
- 将 num 中所有出现 x 的数位都用 y 替换。
令两次对 num 的操作得到的结果分别为 a 和 b 。
请你返回 a 和 b 的 最大差值 。
注意,新的整数(a 或 b)必须不能 含有前导 0,并且 非 0。
示例 1:
- 输入:num = 555
- 输出:888
- 解释:第一次选择 x = 5 且 y = 9 ,并把得到的新数字保存在 a 中。
- 第二次选择 x = 5 且 y = 1 ,并把得到的新数字保存在 b 中。
- 现在,我们有 a = 999 和 b = 111 ,最大差值为 888
示例 2:
- 输入:num = 9
- 输出:8
- 解释:第一次选择 x = 9 且 y = 9 ,并把得到的新数字保存在 a 中。
- 第二次选择 x = 9 且 y = 1 ,并把得到的新数字保存在 b 中。
- 现在,我们有 a = 9 和 b = 1 ,最大差值为 8
示例 3:
- 输入:num = 123456
- 输出:820000
示例 4:
- 输入:num = 10000
- 输出:80000
示例 5:
- 输入:num = 9288
- 输出:8700
说明:
- 1 <= num <= 10^8
思路
从 num
中选择一个数字 d
,可以将 num
中所有的 d
都替换成另一个数字(不允许包含前导零),返回能够得到的最大值与最小值的差。
与 2566.替换一个数字后的最大差值 的区别是不能有前导零。
最大值:找到第一个不是 9
的位置,将 num
中所有与之相同的数字替换为 9
。
最小值:找到第一个不是 1
的位置,如果是首位,将 num
中所有与之相同的数字替换为 1
,否则替换为 0
。
代码
/**
* @date 2025-06-15 18:15
*/
public class MaxDiff1432 {
public int maxDiff(int num) {
int a = num, b = num;
String s = String.valueOf(num);
int n = s.length();
int m = (int) Math.pow(10, n - 1);
int ar = '-', br = '-';
boolean first = false;
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
if (ar == '-' && c != '9') {
ar = c;
}
if (br == '-' && c > '1') {
br = c;
first = i == 0;
}
if (ar == c) {
a += (9 - (c - '0')) * m;
}
if (br == c) {
b -= ((c - '0') - (first ? 1 : 0)) * m;
}
m /= 10;
}
return a - b;
}
}