[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;
}
};
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)