难度 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);
}
};
参考资料: