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