列表

详情


1432. 改变一个整数能得到的最大差值

给你一个整数 num 。你可以对它进行如下步骤恰好 两次 :

令两次对 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

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int maxDiff(int num) { } };

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)

上一题