贪心思想,为了得到最大差,想办法变成一个最大的数和一个最小的数。
这里有规则,从最高位开始,
变成最大,如果<9,则将该数位代表的数都变成9,如果该数位已经是9了,则将下一个数位如此循环
变成最小,如果>1,则将该数位代表的数都变成1,如果该数位已经是1了,则从下一个数位开始,为了最小,应从0开始修改,并注意判断如果都是一样的位数1,则不能修改为0。避免前导0和0的出现。
例如num=9288,则最大是9988,最小是1288
例如num=111,则最大是999,最小值100,最大差值是899
class Solution {
public int maxDiff(int num) {
// 将数字转换为数组
int length = 0;
int temp = num;
while(temp != 0){
temp /= 10;
length ++;
}
// 初始化数组
int[] digits = new int[length];
temp = num;
for (int i = length-1; i >= 0; i--){
digits[i] = temp % 10;
temp /= 10;
}
// 构造最大最小数组
int[] maxNum = Arrays.copyOf(digits, length);
int[] minNum = Arrays.copyOf(digits, length);
// 构造最大数
for (int i = 0; i < length; i++){
if (maxNum[i] < 9){
// 保留当前位数的值
int target = maxNum[i];
maxNum[i] = 9;
// 修改后面所有相同的数字
for (int j = i+1; j < length; j++){
if (maxNum[j] == target){
maxNum[j] = 9;
}
}
// 注意这里找到修改的数后要退出
break;
}
}
// 构造最小数,避免前导0以及0
if (minNum[0] > 1){
// 则可以更改为1
int target = minNum[0];
minNum[0] = 1;
for (int j = 1; j < length; j++){
if (minNum[j] == target){
minNum[j] = 1;
}
}
}else{
// 说明是从1开始的,这个时候就往后找>1的数字及后面的数字,并修改为0
boolean found = false;
for (int i = 1; i < length; i++){
if (minNum[i] > 1){
int target = minNum[i];
minNum[i] = 0;
for (int j = i + 1; j < length; j++){
if (minNum[j] == target){
minNum[j] = 0;
}
}
// 这个时候说明已经找到了
found = true;
break;
}
}
// 反之就是没有找到后面>1的数,则说明该数都是1
if (!found){
// 不做任何修改
}
}
// 最后计算差值
int max = arrayToNumber(maxNum);
int min = arrayToNumber(minNum);
return max - min;
}
// 将数组转换为数字
public int arrayToNumber (int[] arr){
int num = 0;
for (int digit : arr){
num = num*10 + digit;
}
return num;
}
}
也可以通过枚举的方法,枚举替换的数字,并查看是否可行,然后维护最大最小值。
class Solution {
public int maxDiff(int num) {
// 枚举x和y
int minNum = num;
int maxNum = num;
for (int x = 0; x < 10; x++){
for (int y = 0; y < 10; y++){
String res = change(num, x, y);
if (res.charAt(0) != '0'){
int res_i = Integer.parseInt(res);
minNum = Math.min(minNum, res_i);
maxNum = Math.max(maxNum, res_i);
}
}
}
return maxNum - minNum;
}
// 将数字替换x,y
public String change(int num, int x, int y){
StringBuffer num_s = new StringBuffer(String.valueOf(num));
int length = num_s.length();
for (int i = 0; i < length; i++){
char digit = num_s.charAt(i);
if (digit - '0' == x){
num_s.setCharAt(i, (char) ('0' + y));
}
}
return num_s.toString();
}
}

被折叠的 条评论
为什么被折叠?



