单调递增的数字
难度:
标签:
题目描述
代码结果
运行时间: 21 ms, 内存: 16.0 MB
/*
* 题目思路:
* 1. 使用Stream对字符串进行处理。
* 2. 将数字转换为字符数组,以便逐个检查每一位。
* 3. 从左到右扫描字符数组,找到第一个违反单调递增的地方。
* 4. 将该位减1,并将其右侧的所有位变为9。
*/
import java.util.stream.IntStream;
public class MonotoneIncreasingDigitsStream {
public int monotoneIncreasingDigits(int n) {
char[] digits = Integer.toString(n).toCharArray();
int marker = IntStream.range(1, digits.length)
.filter(i -> digits[i] < digits[i - 1])
.findFirst()
.orElse(digits.length) - 1;
if (marker >= 0) digits[marker]--;
IntStream.range(marker + 1, digits.length).forEach(i -> digits[i] = '9');
return Integer.parseInt(new String(digits));
}
}
解释
方法:
这个题解的思路是从数字的末尾开始,逐位进行分析。如果当前位的数字比前一位的数字小,那么就将前一位的数字减1,并将当前位以及后面的所有位都设置为9。这样可以确保修改后的数字是小于等于原数字的最大单调递增数字。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在发现当前位的数字比前一位的数字小时,将前一位的数字减1而不是进行其他操作?
▷🦆
在处理过程中,将当前位以及后续所有位设置为9的操作是如何保证结果是小于等于原数字的最大单调递增数字?
▷🦆
如果在数字的最高位需要进行修改,这种方法处理后的结果是否依然有效?
▷🦆
在将字符列表重新转换成整数时,是否有可能遇到整数溢出的问题,尤其是在接近输入范围上限的情况下?
▷相关问题
移掉 K 位数字
给你一个以字符串表示的非负整数 num
和一个整数 k
,移除这个数中的 k
位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。
示例 1 :
输入:num = "1432219", k = 3 输出:"1219" 解释:移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219 。
示例 2 :
输入:num = "10200", k = 1 输出:"200" 解释:移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。
示例 3 :
输入:num = "10", k = 2 输出:"0" 解释:从原数字移除所有的数字,剩余为空就是 0 。
提示:
1 <= k <= num.length <= 105
num
仅由若干位数字(0 - 9)组成- 除了 0 本身之外,
num
不含任何前导零