题目 #
给你一个整数 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
解答 #
分类讨论:
- 最大值:找到第一个不为9的数,将全部这个数替换为9即可
- 最小值:
- 第一个数为1:找第一个大于1的数(而不是第一个大于0的数,因为等于1,不能将其修改为0,会产生前导零),将其修改为0
- 第一个数不为1:修改第一个数,将其修改为1,其他等于第一个数的也修改为1
class Solution {
int getMax(char[] arr){
int i=0;
while(i<arr.length&&arr[i]=='9'){i++;};
if(i!=arr.length){
char target=arr[i];
arr[i]='9';
for(int index=i+1;index<arr.length;index++){
if(target==arr[index]){
arr[index]='9';
}
}
}
return Integer.parseInt(new String(arr));
}
int getMin(char[] arr){
if(arr[0]=='1'){
int i=1;
while(i<arr.length&&arr[i]<='1'){i++;};
if(i!=arr.length){
char target=arr[i];
arr[i]='0';
for(int index=i+1;index<arr.length;index++){
if(target==arr[index]){
arr[index]='0';
}
}
}
}else{
char target=arr[0];
arr[0]='1';
for(int index=1;index<arr.length;index++){
if(target==arr[index]){
arr[index]='1';
}
}
}
return Integer.parseInt(new String(arr));
}
public int maxDiff(int num) {
if (num < 10)
return 8;
String numStr = String.valueOf(num);
char[] arr = numStr.toCharArray();
int maxVal = getMax(arr);
arr=numStr.toCharArray();// 注意需要重开一个数组,不然一直修改同一个数组
int minVal = getMin(arr);
// System.out.println(maxVal+":"+minVal);
return maxVal - minVal;
}
}