改变一个整数能得到的最大差值
难度:
标签:
题目描述
代码结果
运行时间: 24 ms, 内存: 16.0 MB
// Java Stream Solution
// 思路与普通 Java 解法相同,这里使用 Stream 的方式实现。
// 第一次替换中,我们使用 replaceAll 将特定字符替换成 9。
// 第二次替换中,我们使用 replaceAll 将特定字符替换成 1(若可能为前导 0 则替换成 0)。
import java.util.stream.Collectors;
public class SolutionStream {
public int maxDifference(int num) {
String numStr = String.valueOf(num);
// 第一次操作,替换成尽可能大的数字
char maxReplaceChar = numStr.chars().mapToObj(c -> (char) c)
.filter(c -> c != '9').findFirst().orElse(numStr.charAt(0));
String a = numStr.replaceAll(String.valueOf(maxReplaceChar), "9");
// 第二次操作,替换成尽可能小的数字
char minReplaceChar = numStr.chars().mapToObj(c -> (char) c)
.filter(c -> c != '1' && c != '0').findFirst().orElse(numStr.charAt(0));
String b = (minReplaceChar == '1' || minReplaceChar == '0')
? numStr.replaceFirst("1", "0")
: numStr.replaceAll(String.valueOf(minReplaceChar), "1");
// 计算并返回最大差值
return Integer.parseInt(a) - Integer.parseInt(b);
}
}
解释
方法:
此题解的核心思路是通过两次替换操作生成两个整数a和b,然后计算它们的差值,以得到最大的差值。为了得到最大的a,应选择第一个非'9'的数字替换为'9'。而为了得到最小的b,首先检查首位数字是否为'1'。如果不是,将首位替换为'1';如果首位已经是'1',则找到第一个不是'0'或'1'的后续数字,将其替换为'0'。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么在选择替换数字时,首选将非'9'的数字替换为'9'而不是其他数字?
▷🦆
如果数字num的所有位都是'9',那么如何处理以确保仍然能正确执行替换操作并计算差值?
▷🦆
在替换为最小值b的过程中,如果首位数字已经是'1',选择将后续第一个非'0'或'1'的数字替换为'0'的依据是什么?
▷🦆
替换操作是否考虑了可能出现的多次相同数字,会不会因为替换其中一个数字而影响到本该替换的其他同样的数字?
▷