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
时间: 2025-06-25 07:03:57 浏览: 20
### Java实现高精度大整数删除N位生成最小新数的算法
以下是基于贪心算法设计的一个完整的Java程序,该程序可以处理长度高达240位的大整数,并通过删除指定数量的数字来生成可能的最小新数。
#### 贪心算法的核心思路
每一步总是选择一个使剩下的数最小的数字删除。具体来说,按照高位到低位的顺序搜索:
- 如果当前数字大于其后面的数字,则删除这个较大的数字;
- 如果整个序列是非递减的,则从末尾依次删除多余的数字[^1]。
#### 完整代码实现
```java
import java.util.Scanner;
public class MinNumberAfterDeletion {
public static String deleteDigits(String number, int s) {
StringBuilder sb = new StringBuilder(number);
int index = 0;
// 使用贪心策略逐步删除s个数字
while (s > 0 && sb.length() > 0) {
boolean deleted = false;
for (index = 0; index < sb.length() - 1; index++) {
if (sb.charAt(index) > sb.charAt(index + 1)) {
sb.deleteCharAt(index); // 删除当前位置的较大值
deleted = true;
s--;
break;
}
}
// 如果遍历到最后都没有找到可删除的情况,则删除最后一个字符
if (!deleted && s > 0) {
sb.deleteCharAt(sb.length() - 1);
s--;
}
}
// 移除前导零并返回结果
while (sb.length() > 1 && sb.charAt(0) == '0') {
sb.deleteCharAt(0);
}
return sb.toString();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 输入原始大整数和需要删除的数字个数
String inputNumber = scanner.nextLine().trim();
int digitsToRemove = Integer.parseInt(scanner.nextLine().trim());
// 处理特殊情况:如果需要删除的数量超过总长度或者等于总长度
if (digitsToRemove >= inputNumber.length()) {
System.out.println("0");
} else {
// 计算最终的结果
String result = deleteDigits(inputNumber, digitsToRemove);
System.out.println(result);
}
scanner.close();
}
}
```
#### 关键点解析
1. **StringBuilder 的使用**
`StringBuilder` 提供了高效的字符串操作方法,适合动态修改字符串的内容。每次调用 `deleteCharAt()` 方法可以直接移除目标位置上的字符[^1]。
2. **边界条件处理**
- 当输入的数字全是相同的(如全为9)时,应优先从右侧开始删除多余的部分。
- 如果剩余部分存在多个连续的相同数字,需确保保留最左侧的小数值组合[^3]。
3. **时间复杂度分析**
整体的时间复杂度接近 O(L),其中 L 是初始数字的长度。这是因为每个字符最多只会被访问两次——一次作为候选删除对象,另一次则成为新的比较起点[^4]。
---
###
阅读全文
相关推荐












