找最小数 - 华为OD统一考试(E卷)
2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集
题目描述
给一个正整数NUM1,计算出新正整数NUM2,NUM2为NUM1中移除N位数字后的结果需要使得NUM2的值最小。
输入描述
- 输入的第一行为一个字符串,字符串由0-9字符组成,记录正整数NUM1,NUM1长度小于32。
- 输入的第二行为需要移除的数字的个数,小于NUM1长度。
输出描述
输出一个数字字符串,记录最小值NUM2。
示例1
输入:
2615371
4
输出:
131
说明:
示例2
输入:
输出:
说明:
题解
问题分析
这道题可以归类为贪心算法。目标是在尽量靠左的地方删除比后面大的数字,使得剩下的数字更小。删除操作中优先考虑移除高位的数字,尽量保持低位数字小。
解题的基本思路:
- 使用一个栈来存储字符。
- 从左到右遍历数字字符串,如果当前数字比栈顶的数字小且还可以删除数字,就弹出栈顶数字。
- 遍历完成后,如果删除的数字还不够,则继续从后向前删除栈顶数字。
- 最后,将栈中剩下的数字拼接成结果,并移除前导零。
时间复杂度
- 时间复杂度为O(n),因为每个数字最多进出栈一次。
- 空间复杂度为O(n),用于存储栈中的数字。
Java
import java.util.Scanner;
import java.util.Stack;
/**
* @author code5bug
*/
public class Main {
public static String removeDigits(String num, int k) {
Stack<Character> stack = new Stack<>();
for (char digit : num.toCharArray()) {
while (!stack.isEmpty() && k > 0 && stack.peek() > digit) {
stack.pop();
k--;
}
stack.push(digit);
}
// 如果 k 还大于 0,继续从栈顶删除
while (k > 0) {
stack.pop();
k--;
}
// 构建结果
StringBuilder result = new StringBuilder();
for (char digit : stack) {
if (!(result.length() == 0 &&
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
华为OD机试题库题解2024 文章被收录于专栏
华为OD机考(CDE卷)题库(绝对都是原题),帮助你上岸华为(已经不少小伙伴成功上岸)。提供Java、Python、C++ 三种语言的解法。每篇文章都有详细的解题步骤、代码注释详细及相关知识点的练习题。有问题,随时解答。