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

难度 medium

给你一个整数 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

解题思路:这里解题思路还是相对比较直接的,就是将数字转换为字符串,然后从左向右遍历找到第一个不为'9'的字符,然后把该字符串和这个字符相同的所有字符都替换成'9',找最小值的过程相似,如果第一个字符是'1',那就往后遍历,找到即不为'0'也不为'1'的第一个字符,然后把该字符串和这个字符相同的所有字符都替换成'0',否则第一个字符为'1',则把把该字符串和这个字符相同的所有字符都替换成'1',因为第一个字符不能为'0',然后把两个替换后的字符串转换为整数并返回其差值即可。

代码 t98 s80 java

class Solution {
    public int maxDiff(int num) {
        String  s = Integer.toString(num);
        int len = s.length(), i = 0, maxVal = 0, minVal = 0;
        while(i<len && s.charAt(i)=='9') i++;
        if(i<len) maxVal = Integer.valueOf(s.replace(s.charAt(i), '9'));
        else maxVal = Integer.valueOf(s);
        if(s.charAt(0)=='1' && s.length()>1){
            i = 1;
            while(i<len && (s.charAt(i)=='1' || s.charAt(i)=='0')) i++;
            if(i<len) minVal = Integer.valueOf(s.replace(s.charAt(i), '0'));
            else minVal = Integer.valueOf(s);
        }else{
            minVal = Integer.valueOf(s.replace(s.charAt(0), '1'));
        }
        return maxVal - minVal;
    }
}

下面两个是9个月前提交的cpp版本的代码。

代码t50 s20

class Solution {
public:
    int maxDiff(int num) {
        string maxStr = to_string(num), minStr = maxStr;
        int len = maxStr.size(), i = 0;
        while(i<len && maxStr[i]=='9') i++;
        if(i<len){
            char replace = maxStr[i];
            for(int k=i; k<len; k++){
                if(maxStr[k]==replace) maxStr[k] = '9';
            }
        }
        if(minStr[0]!='1'){
            char replace = minStr[0];
            for(int k=0; k<len; k++){
                if(minStr[k]==replace) minStr[k] = '1';
            }
        }
        else{
            int i = 1;
            while(i<len && (minStr[i]=='0' || minStr[i]=='1')) i++;
            if(i<len){
                char replace = minStr[i];
                for(int k=i; k<len; k++){
                    if(minStr[k]==replace) minStr[k] = '0';
                }
            }
        }
        return atoi(maxStr.c_str()) - atoi(minStr.c_str());
    }
};

思路一样的,但时空更优

class Solution {
public:
    int maxDiff(int num) {
        string big = to_string(num);
        char cmp = 'x';
        for (char& ch : big) { //找第1个不是9的数
            if (ch != '9') {
                cmp = ch;
                break;
            }
        }
        if (cmp != 'x') { //不需要变数就是最大值
            for (char& ch : big) //
                if (ch == cmp) ch = '9';
        }

        string small = to_string(num);
        cmp = 'x';
        char to = 'x';
        if (small[0] != '1') { //第1位不是1
            cmp = small[0];
            to = '1';
        }
        else { //第1位是1
            for (int i = 1; i < small.size(); ++i) { //找第1个不是0的数
                if (small[i] != '0' && small[i] != small[0]) {
                    cmp = small[i];
                    to = '0';
                    break;
                }
            }
        }
        if (cmp != 'x') { //不需要变数就是最小值
            for (char& ch : small) {
                if (ch == cmp) ch = to;
            }
        }  
        return stoi(big) - stoi(small);
    }
};

参考资料

上一篇:PAT B1004 成绩排名(C++)


下一篇:「SNOI2019」字符串