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

Posted STWILLD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
    }
};

参考资料

以上是关于1432. 改变一个整数能得到的最大差值的主要内容,如果未能解决你的问题,请参考以下文章

为什么我的代码不通过?​增量元素之间的最大差值

2023-04-29:一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 由于答案可能非常大,请返回对 109

「 每日一练,快乐水题 」2016. 增量元素之间的最大差值

「 每日一练,快乐水题 」2016. 增量元素之间的最大差值

AcWing第2次周赛——第二题(3627. 最大差值 )贪心策略

BZOJ 1432: [ZJOI2009]Function