❗❗❗必看:
下列题我全部都使用 Java 语言写的,并且均可以提交成功,获得Accepted 结果的. 如果代码和详解看了之后,对答案有任何疑问,都可以在评论区提出来,我都会一个一个回答.
❗❗❗感谢大家的支持,如果喜欢我的博客,关注 点赞 收藏 评论一波,非常感谢!!!
题目:最小新整数
给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。
现在从m位中删除k位(0<k < m),求生成的新整数最小为多少?
例如: n = 9128456, k = 2, 则生成的新整数最小为12456
Input
第一行t, 表示有t组数据;
接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n, k。
Output
t行,每行一个数字,表示从n中删除k位后得到的最小整数。
样例测试
输入
2
9128456 2
1444 3
输出
12456
1
代码
//最小新整数
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//输入t组数据
int t = sc.nextInt();
sc.nextLine(); // 读取换行符
for(int i = 0;i<t;i++) {
String num = sc.next();
int k = sc.nextInt();
//调用计算最小新整数
String result = minNewNum(num,k);
System.out.println(result);
}
}
private static String minNewNum(String num, int k) {
Stack<Character> stack = new Stack<>();
for(int i = 0;i<num.length();i++) {
char current = num.charAt(i);
while(!stack.isEmpty()&¤t<stack.peek()&&k>0) {
stack.pop();
k--;
}
stack.push(current);
}
//如果遍历完,k依旧没有用完,那么就从栈尾中删除数据
while(k>0) {
stack.pop();
k--;
}
StringBuilder results = new StringBuilder();
for(char result : stack) {
results.append(result);
}
return results.toString();
}
}
图示
同样,还是建议看看我画的图,虽然有点抽象,但是很好理解的其实.
详解
初步思路
利用栈的特性,通过遍历数字的每一位,尽量保证栈中的数字从左到右递增,从而实现删除k位后,剩下的数字最小。
具体步骤
-
初始化栈:用于保存处理后的数字字符。
-
遍历数字字符
:逐一遍历数字的每一位字符。
- 如果栈不为空且当前字符小于栈顶字符,并且还有可以删除的字符(k > 0),则弹出栈顶字符,这样可以保证删除后的数字更小。
- 将当前字符压入栈中。
-
处理剩余删除次数:如果遍历完后k仍然大于0,说明还有多余的删除次数,需要从栈尾删除字符。
-
生成结果:将栈中字符拼接成字符串,得到删除k位后的最小整数。
总结方法
这道题通过利用栈来保存处理后的字符,确保从左到右递增,从而实现最小化结果。这个方法的核心在于动态调整栈中的字符顺序,使其在遍历过程中始终保持最小可能的状态。这个思路在处理需要保留顺序并优化结果的题目中非常有效,具有很好的启发性。