题意:给定一个自然数,删除任意位数,剩下数最小。
分析一下组成数最小的规律是什么?
比如有两个数:4 和 6
两种情况 46 或 64 ,我们发现最小情况是高位越小,组成数越小。
再比如有三个数:4、6 和 8
会出现六种情况 468 486 648 684 846 864
发现满足 ==> 高位越小,组成数越小。
175438去掉一位最小是什么,两位呢?
175438 ==去掉1==>> 75438
175438 ==去掉7==>> 15438 ==> 最小组成数
175438 ==去掉5==>> 17438
175438 ==去掉4==>> 17538
175438 ==去掉3==>> 17548
175438 ==去掉8==>> 17543
去两位变化: 15438 ==> 1438
去的规律是什么:去掉升序子列的末位(降序首位),这样剩下的数便是最小的。
以124236357为例分解为三个升序
第一次只要去掉,升序最后一位4,剩下便是最小;
第二次重新分解,再去掉升序最后一位,
·····
1238456去掉三位
先分解为 1238;456,去掉8
再分解为 123456 ,发现这个数变成个纯升序但我们才删一位。
这种情况就直接从后往前删够位数就行了。
具体代码实现(Java)
/**
* 删数问题
*
* @param n 高精度的自然数n
* @param s 去掉其中任意s个数字
* @return 最小新数
*/
private static StringBuilder deleteTheIssue(int n, int s) {
StringBuilder stringBuilder = new StringBuilder(String.valueOf(n));
for (int i = 0; i < stringBuilder.length() - 1; i++) {
if (stringBuilder.charAt(i) > stringBuilder.charAt(i + 1)) {
stringBuilder.delete(i, i + 1);
if (s-- == 0) {
break;
}
i = 0;
}
}
while (s-- > 0) {
stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length());
}
return stringBuilder;
}