java问题描述】输入一个高精度的大正整数S(S最长可达240位),去掉其中任意N位数字后剩下的数字按原次序组成一个新的正整数S'。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数S'最小。 【输入形式】输入有两行: 1.第一行是大整数S。其中S最长可达240位。 2.第二行是整数N。S、N均以非0数字开头。 【输出形式】输出有一行,是在S中删除N位后所得的最小数字S'。 【样例输入1】 178543 4 【样例输出1】13 【样例输入2】 1002 1 【样例输出2】002 【样例说明】样例1中输入整数S=178543,N=4,要求在178543中删除4位,使剩下的数字最小。正确答案为S'= 13。样例2中输入整数S=1002,N=1,删完一位后S'= 002,而不是2,即2之前的0也必须输出。
时间: 2025-06-25 10:04:04 浏览: 24
### Java 实现高精度大整数删除指定位数后得到最小新数的算法
#### 问题分析
给定一个高精度的大整数 `num` 和需要删除的数字个数 `k`,目标是从原数字中移除 `k` 个数字,使得剩下的数字组成的新数是最小可能值。此问题可以通过贪心算法解决。
核心思路在于维护一个单调栈结构来保存结果中的每一位数字,在遍历过程中动态调整栈内的元素顺序以满足条件。
---
#### 算法描述
以下是基于贪心策略的具体实现方法:
1. 使用一个列表(List 或 StringBuilder)作为「栈」模拟过程。
2. 遍历原始数字字符串中的每一个字符:
- 如果当前栈顶元素大于即将加入的字符,并且还可以继续删除 (`k > 0`),则弹出栈顶元素直到不再满足该条件为止。
- 将当前字符压入栈中。
3. 若遍历结束后仍有剩余可删次数,则从栈尾直接截断多余的部分。
4. 处理前导零:如果最终结果存在多余的前导零,需去掉它们。
5. 返回构建完成的结果字符串表示形式。
这种方法的时间复杂度接近 O(n),其中 n 是输入数字串的长度[^5]。
---
#### Java 实现代码
下面提供完整的 Java 版本解决方案:
```java
import java.util.*;
public class MinNumberAfterDeletion {
public static String minNumber(String num, int k) {
if (num == null || k >= num.length()) return "";
StringBuilder stack = new StringBuilder();
int length = num.length();
for (int i = 0; i < length; ++i) {
char currentChar = num.charAt(i);
// 当还有未使用的删除机会时尝试优化序列
while (stack.length() > 0 && k > 0 && stack.charAt(stack.length() - 1) > currentChar) {
stack.deleteCharAt(stack.length() - 1); // 移除最后一个较大的字符
--k;
}
stack.append(currentChar); // 添加当前字符到栈中
}
// 如果还剩下一些删除配额,就简单地裁剪掉最后几位
while (k > 0 && stack.length() > 0) {
stack.deleteCharAt(stack.length() - 1);
--k;
}
// 转化成字符串并去除任何潜在的前导零
String resultStr = stack.toString().replaceFirst("^0+(?!$)", "");
return resultStr.isEmpty() ? "0" : resultStr;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入高精度大整数:");
String number = scanner.nextLine();
System.out.println("请输入要删除的位数(k):");
int deleteCount = Integer.parseInt(scanner.nextLine());
String minimalResult = minNumber(number, deleteCount);
System.out.printf("删除 %d 位之后形成的最小新数为:%s%n", deleteCount, minimalResult);
}
}
```
---
#### 测试用例验证
假设我们有以下测试场景及其预期输出:
| 输入 | 删除位数(K) | 输出 |
|------|-------------|------|
| `"1432219"` | 3 | `"1219"` |
| `"10200"` | 1 | `"200"` |
| `"10"` | 2 | `"0"` |
运行以上程序即可获得相应正确答案。
---
阅读全文
相关推荐


















