class Solution {
public:
int maxDiff(int num) {
}
};
1432. 改变一个整数能得到的最大差值
给你一个整数 num
。你可以对它进行如下步骤恰好 两次 :
x (0 <= x <= 9)
.y (0 <= y <= 9)
。数字 y
可以等于 x
。num
中所有出现 x
的数位都用 y
替换。令两次对 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
原站题解
golang 解法, 执行用时: 0 ms, 内存消耗: 1.8 MB, 提交时间: 2023-09-14 15:20:30
func maxDiff(num int) int { maxVal, minVal := num, num s := strconv.Itoa(num) // 找最大 for i := 0; i < len(s); i++ { if s[i] < '9' { maxVal, _ = strconv.Atoi(strings.ReplaceAll(s, string(s[i]), "9")) break } } // 找最小 if s[0] > '1' { minVal, _ = strconv.Atoi(strings.ReplaceAll(s, string(s[0]), "1")) } else { for i := 1; i < len(s); i++ { if s[i] > '1' && s[i] != s[0] { minVal, _ = strconv.Atoi(strings.ReplaceAll(s, string(s[i]), "0")) break } } } return maxVal - minVal }
rust 解法, 执行用时: 0 ms, 内存消耗: 2.1 MB, 提交时间: 2023-09-14 15:19:52
impl Solution { pub fn max_diff(num: i32) -> i32 { let mut max = num.to_string(); if let Some(c) = max.chars().find(|&c| c != '9') { max = max.replace(c, "9"); } let mut min = num.to_string(); if min.starts_with('1') { if let Some(c) = min.chars().find(|&c| c != '1' && c != '0') { min = min.replace(c, "0"); } } else { if let Some(c) = min.chars().nth(0) { min = min.replace(c, "1"); } } max.parse::<i32>().unwrap() - min.parse::<i32>().unwrap() } }
java 解法, 执行用时: 11 ms, 内存消耗: 41.6 MB, 提交时间: 2023-09-14 15:19:11
class Solution { public int maxDiff(int num) { int min_num = num; int max_num = 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); min_num = Math.min(min_num, res_i); max_num = Math.max(max_num, res_i); } } } return max_num - min_num; } 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(); } } class Solution2 { public int maxDiff(int num) { StringBuffer min_num = new StringBuffer(String.valueOf(num)); StringBuffer max_num = new StringBuffer(String.valueOf(num)); // 找到一个高位替换成 9 int max_length = max_num.length(); for (int i = 0; i < max_length; ++i) { char digit = max_num.charAt(i); if (digit != '9') { replace(max_num, digit, '9'); break; } } // 将最高位替换成 1 // 或者找到一个与最高位不相等的高位替换成 0 int min_length = min_num.length(); for (int i = 0; i < min_length; ++i) { char digit = min_num.charAt(i); if (i == 0) { if (digit != '1') { replace(min_num, digit, '1'); break; } } else { if (digit != '0' && digit != min_num.charAt(0)) { replace(min_num, digit, '0'); break; } } } return Integer.parseInt(max_num.toString()) - Integer.parseInt(min_num.toString()); } public void replace(StringBuffer s, char x, char y) { int length = s.length(); for (int i = 0; i < length; ++i) { if (s.charAt(i) == x) { s.setCharAt(i, y); } } } }
python3 解法, 执行用时: 48 ms, 内存消耗: 15.8 MB, 提交时间: 2023-09-14 15:17:41
class Solution: # 枚举,暴力替换 def maxDiff(self, num: int) -> int: def change(x, y): return str(num).replace(str(x), str(y)) min_num = max_num = num for x in range(10): for y in range(10): res = change(x, y) # 判断是否有前导零 if res[0] != "0": res_i = int(res) min_num = min(min_num, res_i) max_num = max(max_num, res_i) return max_num - min_num # 贪心,最高位第一个非9替换成9,最高位非1,替换成1,否则从次高位开始非0替换成0 def maxDiff(self, num: int) -> int: min_num, max_num = str(num), str(num) # 找到一个高位替换成 9 for digit in max_num: if digit != "9": max_num = max_num.replace(digit, "9") break # 将最高位替换成 1 # 或者找到一个与最高位不相等的高位替换成 0 for i, digit in enumerate(min_num): if i == 0: if digit != "1": min_num = min_num.replace(digit, "1") break else: if digit != "0" and digit != min_num[0]: min_num = min_num.replace(digit, "0") break return int(max_num) - int(min_num)