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. 增量元素之间的最大差值