【代码+详解】算法题 : 最小新整数

❗❗❗必看:
下列题我全部都使用 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()&&current<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位后,剩下的数字最小。

具体步骤
  1. 初始化栈:用于保存处理后的数字字符。

  2. 遍历数字字符

    :逐一遍历数字的每一位字符。

    • 如果栈不为空且当前字符小于栈顶字符,并且还有可以删除的字符(k > 0),则弹出栈顶字符,这样可以保证删除后的数字更小。
    • 将当前字符压入栈中。
  3. 处理剩余删除次数:如果遍历完后k仍然大于0,说明还有多余的删除次数,需要从栈尾删除字符。

  4. 生成结果:将栈中字符拼接成字符串,得到删除k位后的最小整数。

总结方法

这道题通过利用栈来保存处理后的字符,确保从左到右递增,从而实现最小化结果。这个方法的核心在于动态调整栈中的字符顺序,使其在遍历过程中始终保持最小可能的状态。这个思路在处理需要保留顺序并优化结果的题目中非常有效,具有很好的启发性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值