机考E卷100分题 - 找最小数

题目描述

给一个正整数NUM1,计算出新正整数NUM2,NUM2为NUM1中移除N位数字后的结果,需要使得NUM2的值最小。

输入描述

1.输入的第一行为一个字符串字符串由0-9字符组成,记录正整数NUM1,NUM1长度小于32。
2.输入的第二行为需要移除的数字的个数,小于NUM1长度。

输出描述

输出一个数字字符串,记录最小值NUM2。

用例

输入

2615371 
4 
12

输出

131 
1

解题思路

原题:https://leetcode.cn/problems/remove-k-digits/solutions/

维护一个单调递增的栈来实现移除数字

  1. 初始化一个空栈 stack,用于存储需要保留的数字。
  2. 遍历输入的正整数 NUM1 中的每个字符。
  3. 对于当前字符,检查栈顶元素是否大于当前字符,如果是,则出栈并减少需要移除的数字个数。这样可以确保移除的数字使得新正整数 NUM2 的值最小。
  4. 将当前字符入栈。
  5. 遍历完成后,如果仍有需要移除的数字个数,从栈顶开始移除剩余的数字。
  6. 将栈中的字符连接成一个字符串,去除前导零,输出结果。如果结果为空,则输出 “0”。

C++

#include <iostream>
#include <string>
#include <vector>

int main() {
    // 读取输入的正整数 NUM1 和需要移除的数字个数
    std::string num;
    int k;
    std::cin >> num >> k;

    // 使用一个 vector 作为栈来存储结果
    std::vector<char> stack;

    // 遍历输入的数字字符串
    for (char i : num) {
        // 当栈非空、k 大于 0 且栈顶元素大于当前数字时,弹出栈顶元素并减小 k
        while (!stack.empty() && k > 0 && stack.back() > i) {
            k--;
            stack.pop_back();
        }
        // 将当前数字压入栈中
        stack.push_back(i);
    }

    // 构建结果字符串,移除多余的 k 个数字
    std::string result(stack.begin(), stack.end() - k);
    // 删除结果字符串中的前导零
    result.erase(0, result.find_first_not_of('0'));
    // 如果结果为空,则输出 "0"
    if (result.empty()) {
        result = "0";
    }

    // 输出结果
    std::cout << result << std::endl;

    return 0;
}


12345678910111213141516171819202122232425262728293031323334353637383940

java

import java.util.Scanner;
import java.util.Stack;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取输入的正整数 NUM1 和需要移除的数字个数
        String num = scanner.next();
        int k = scanner.nextInt();

        Stack<Character> stack = new Stack<>();

        // 遍历 NUM1 中的每个字符
        for (char c : num.toCharArray()) {
            // 当栈非空、需要移除的数字个数大于 0 且栈顶元素大于当前字符时,出栈并减少需要移除的数字个数
            while (!stack.isEmpty() && k > 0 && stack.peek() > c) {
                stack.pop();
                k--;
            }
            stack.push(c);
        }

        // 移除剩余的数字
        while (k > 0) {
            stack.pop();
            k--;
        }

        // 构建结果字符串
        StringBuilder result = new StringBuilder();
        boolean leadingZero = true;
        for (char c : stack) {
            if (c == '0' && leadingZero) {
                continue;
            }
            leadingZero = false;
            result.append(c);
        }

        // 输出结果字符串,如果为空则输出 "0"
        System.out.println(result.length() == 0 ? "0" : result.toString());
    }
}


12345678910111213141516171819202122232425262728293031323334353637383940414243444546

javaScript



const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.on('line', (num) => {
  rl.on('line', (k) => {
     const stack = [];

    for (const i of num) {
      while (stack.length > 0 && k > 0 && stack[stack.length - 1] > i) {
        k -= 1;
        stack.pop();
      }
      stack.push(i);
    }

    console.log((stack.slice(0, stack.length - k).join('').replace(/^0+/, '') || '0'));
    rl.close();
  });
});
 

123456789101112131415161718192021222324252627

python



# 读取输入的正整数 NUM1 和需要移除的数字个数
num = input()
k = int(input())

# 初始化一个栈,用于存储需要保留的数字
stack = []

# 遍历 NUM1 中的每个字符
for i in num:
    # 当栈非空、需要移除的数字个数大于 0 且栈顶元素大于当前字符时
    # 出栈并减少需要移除的数字个数
    while stack and k and stack[-1] > i:
        k -= 1
        stack.pop()
    # 将当前字符入栈
    stack.append(i)

# 输出结果字符串,移除剩余的数字,并去除前导零,如果为空则输出 "0"
print(''.join(stack[:len(stack) - k]).lstrip('0') or "0")


1234567891011121314151617181920212223

C语言

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    char num[32]; // 存储输入的正整数NUM1,长度小于32
    int k;        // 需要移除的数字个数
    scanf("%s %d", num, &k); // 读取NUM1和k

    char stack[32]; // 使用一个字符数组作为栈来存储结果
    int top = -1;   // 栈顶指针,初始为-1表示空栈

    // 遍历输入的数字字符串
    for (int i = 0; i < strlen(num); i++) {
        char current = num[i];
        // 当栈非空、k大于0且栈顶元素大于当前数字时,弹出栈顶元素并减小k
        while (top >= 0 && k > 0 && stack[top] > current) {
            top--;
            k--;
        }
        // 将当前数字压入栈中
        stack[++top] = current;
    }

    // 移除多余的k个数字
    top -= k;

    // 构建结果字符串
    char result[32];
    for (int i = 0; i <= top; i++) {
        result[i] = stack[i];
    }
    result[top + 1] = '\0'; // 添加字符串结束符

    // 删除结果字符串中的前导零
    char *start = result;
    while (*start == '0') {
        start++;
    }
    if (*start == '\0') { // 如果所有数字都被移除,输出"0"
        printf("0\n");
    } else {
        printf("%s\n", start); // 输出结果
    }

    return 0;
}
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647

完整用例

用例1

2615371
4
12

用例2

123456
1
12

用例3

10200
1
12

用例4

456789
3
12

用例5

112233
2
12

用例6

543210
3
12

用例7

1234567890
9
12

用例8

123004560
2
12

用例9

1010101
3
12

用例10

1020304050
5
12
#牛客创作赏金赛#

主要记录自己的刷题日常,学而时习之。

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-12 11:06
康冠科技KTC 大白菜 17K x 14 硕士985
点赞 评论 收藏
分享
面试经验:1.为什么选择珠三角这个地方来工作(改开前列,经济发达地区有更多机会,也有更多的资源)2.珠三角和长三角在同等条件下,会选择哪个区域,为什么3.平时有什么兴趣爱好4.个人有什么缺点(决策不够决断,指定目标的时候有些太远,可实施性不高)5.从哪里了解到的康冠6.对STM32单片机了解的多吗,32的GPIO口在我们使用的时候,需要进行哪些初始化动作(引脚复用的上下拉电阻,代码也需要确定使用输入输出;单功能接口不需要设置)7.STM32单片机的输入输出IO口最高工作速度,大概是多少兆8.项目中使用的传感器与单片机是怎么通信的,用到了哪些协议9.IIC的握手工作流程有了解吗(不了解)10.如果有多个IIC器件挂在这个通信协议上面,那主机如何分辨出来都是哪个从机在进行通信(根据读写标志位,不同的地址代表不同的从机)11.目前有考研计划吗12.两个工作地点是深圳和惠州,都能接受吗(更希望是深圳,但是分到惠州也可以接受)13.在学校有挂科或者学分没有修满的情况吗14.期望的月薪大概是多少(对当年的就业市场不是很了解,目前给自己定的一个就是年薪15w以上,月薪基础工资能够达到税前10-13k,会根据不同的发薪月来进行变动)(面试官希望通过这个来看自己有没有目标)15.反问:岗位介绍,培养方式,晋升机制认为校招生应该具有哪些品质,哪些品质能够让您给他加分(责任心,主动权,即使这个人的专业能力不是很强,如果这两个比较好的话,那这个人是一定可以培养的起来的)#康冠科技2025届秋季校园招聘研发岗提前批正式开启‌康冠科技公司的待遇整体来说较为稳定,‌工资水平根据学历、‌职位和地区有所差异‌。‌从学历角度看,‌本科员工占比最多,‌工资水平相对较高,‌硕士和博士的工资更高。‌从地区差异来看,‌深圳地区的工资普遍高于惠州地区。‌具体到薪资范围,‌大部分岗位的月薪在10-20K之间,‌占比达到70.1%。‌同时,‌公司也提供一系列的福利待遇,‌如加班补助、‌包住、‌通讯补贴、‌住房补贴、‌带薪年假等。‌焕彩新生,智冠未来浩瀚星海,因你璀璨康冠科技2025届秋季校园招聘研发岗提前批正式开启!研发四大类岗位火热招募中~等你速来投递,offer快人一步!「内推码」ESVPT8【内推链接】https://careerktc.zhiye.com/campus/jobs?shareId=070d397a-d444-439d-94d0-54cb8a67dc97&amp;amp;amp;shareSource=2投递的uu留下姓名和岗位~~
康冠科技KTC
|
校招
|
57个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
10-31 17:33
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务