題目
給你一個整數 num 。你可以對它進行如下步驟恰好 兩次 :
選擇一個數字 x (0 <= x <= 9).
選擇另一個數字 y (0 <= y <= 9) 。數字 y 可以等於 x 。
將 num 中所有出現 x 的數位都用 y 替換。
得到的新的整數 不能 有前導 0 ,得到的新整數也 不能 是 0 。
令兩次對 num 的操作得到的結果分別為 a 和 b 。
請你返回 a 和 b 的 最大差值 。
示例 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
解題思路分析1、貪心;時間複雜度O(log(n)),空間複雜度O(log(n))
func maxDiff(num int) int { maxValue, minValue := num, num str := strconv.Itoa(num) for i := 0; i < len(str); i++ { if str[i] < '9' { maxValue, _ = strconv.Atoi(strings.ReplaceAll(str, string(str[i]), "9")) break } } if str[0] > '1' { minValue, _ = strconv.Atoi(strings.ReplaceAll(str, string(str[0]), "1")) } else { for i := 1; i < len(str); i++ { if str[i] > '1' && str[0] != str[i] { minValue, _ = strconv.Atoi(strings.ReplaceAll(str, string(str[i]), "0")) break } } } return maxValue - minValue}
2、暴力法;時間複雜度O(log(n)),空間複雜度O(log(n))
func maxDiff(num int) int { maxValue, minValue := num, num str := strconv.Itoa(num) for x := 0; x < 10; x++ { for y := 0; y < 10; y++ { newStr := strings.ReplaceAll(str, string('0'+x), string('0'+y)) if newStr[0] == '0' { continue } value, _ := strconv.Atoi(newStr) if value > maxValue { maxValue = value } if value < minValue { minValue = value } } } return maxValue - minValue}
總結
Medium題目,可以使用暴力法,也可以分析一下怎麼樣取到最大值和最小值