[LeetCode]5385. 改变一个整数能得到的最大差值 原创
算法标签:贪心,搜索
难度:中等
题目简介
给你一个整数 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,188提交次数3,319
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/max-difference-you-can-get-from-changing-an-integer
 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
时间空间

思路
贪心,尽量更换a9和b0
 需要特判更换b1时的情况
AC代码
class Solution {
public:
    int maxDiff(int num) {
    vector<int> tn,a,b;
    while(num>0){tn.push_back(num%10);num/=10;}//读入为vec
    reverse(tn.begin(),tn.end());//转为正序
    for(auto op:tn)a.push_back(op);//读入到a
    for(auto op:tn)b.push_back(op);//读入到b
        
    int tmpk=0;
    int cnta=1,cntb=1;
    for(int i=0;i<a.size();i++)//尽量把前导数字换成9
    {
        if(a[i]!=9&&cnta)
        {
        tmpk=a[i];
        a[i]=9;
        cnta--;
        }
        
        if(a[i]==tmpk)a[i]=9;//替换所有与被更换数字相同的数字
    }
        
    int w1=0,w2=0;
    for(int i=0;i<b.size();i++)
    {
                
        if(b[i]!=0&&cntb&&i!=0&&b[i]!=1)//尽量把前导数字换成0,但不能是第一个数字,同时也不能是第一个数字为1时的中间数字为1的情况
        {
        tmpk=b[i];
        b[i]=0;
        cntb--;
        w2=2;
        }
        
        if(b[0]!=1&&cntb)//尽量把前导数字换成1
        {
        tmpk=b[i];
        b[i]=1;
        cntb--;
        w1=1;
        }
        
        if(w1&&b[i]==tmpk)b[i]=1;//两种情况只能选择一种,优先高位 即p*pow(10,N)时的p
        if(w2&&b[i]==tmpk)b[i]=0;
    }
    
        int ans=0;
        vector<int> t;
        int cnttt=0;
        for(int i=0;i<a.size();i++)t.push_back(a[i]-=b[i]),cnttt++;//将两列两两相对之差放入新数组
        
        int cnt=0;
        for(int i=t.size()-1;i;i--)cnt++;//计算后缀0的数量
        //for(auto op:t)cout<<op<<" ";
        for(int i=0;i<t.size();i++)ans+=pow(10,cnt--)*a[i];//计算数量并乘上后缀0
        
        return ans;
    }
};
                        
                    
                
                
            
        
浙公网安备 33010602011771号