1. 題目來源
2. 題目說明
3. 題目解析
方法一:暴力+枚舉+常規解法
說白了就是解決兩個問題,一個將原數據變至最大,另一個變至最小。差值即爲最大。思路如下:
- 首先將這個數字一位位的拆分將各位的數字放置在一個數組中,便於替換
- 兩層
for
循環,代表選擇兩次將數組中的a
變成b
,在此需要注意是否存在前導 0 這個不合法的情況,及新數等於 0 的不合法情況 - 這樣做就能將全部情況遍歷完畢後得到最大值與最小值,進而獲得答案
上述這個方法很暴力,枚舉了所有情況。據該題來講,我們可以根據最大數需要將高位變 9,最小數需要將高位變 1 的方法來操作。但確實手速題就沒想太多了。有興趣可以操作試試。
參見代碼如下:
// 執行用時 :0 ms, 在所有 C++ 提交中擊敗了100.00%的用戶
// 內存消耗 :6 MB, 在所有 C++ 提交中擊敗了100.00%的用戶
class Solution {
public:
int maxDiff(int num) {
int ans = 0, top = 0;
int dig[10];
int tmp = num;
while (tmp) {dig[++top] = tmp % 10; tmp /= 10;}
int mx = num, mi = num;
for (int a = 0; a < 10; ++a) {
for (int b = 0; b < 10; ++b) {
int target = 0;
for (int i = top; i >= 1; --i) {
int cur = dig[i];
if (cur == a) cur = b;
if (i == top and cur == 0) {target = 0; break;}
target = target * 10 + cur;
}
if (target == 0) continue;
mi = min(mi, target);
mx = max(mx, target);
}
}
return mx - mi;
}
};