贪心思想,为了得到最大差,想办法变成一个最大的数和一个最小的数。
这里有规则,从最高位开始,
变成最大,如果<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以及0if (minNum[0] > 1){// 则可以更改为1int target = minNum[0];minNum[0] = 1;for (int j = 1; j < length; j++){if (minNum[j] == target){minNum[j] = 1;}}}else{// 说明是从1开始的,这个时候就往后找>1的数字及后面的数字,并修改为0boolean 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的数,则说明该数都是1if (!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和yint 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,ypublic 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();}
}