貪心思想,為了得到最大差,想辦法變成一個最大的數和一個最小的數。
這里有規則,從最高位開始,
變成最大,如果<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();}
}