[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;
    }
};
posted @   俺叫西西弗斯  阅读(0)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示