32. 找最小数

46 阅读1分钟

题目描述

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

输入描述

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

输出描述

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

用例

输入

2615371 
4 

输出

131 

解题思路

402. 移掉 K 位数字 - 力扣(LeetCode)

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

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

std::string removeKdigits(std::string num, int k) {
    std::vector<char>st;
    for (int i = 0; i < num.size(); i++)
    {
        while (!st.empty() && k > 0 && st.back() > num[i])
        {
            st.pop_back();
            --k;
        }
        st.push_back(num[i]);
    }
    while (k != 0 && !st.empty())
    {
        st.pop_back();
        k--;
    }

    std::string ans = "";
    bool isLeadingZero = true;
    for (auto& digit : st) {
        if (isLeadingZero && digit == '0') {
            continue;
        }
        isLeadingZero = false;
        ans += digit;
    }
    return ans == "" ? "0" : ans;
}

int main()
{
	std::string str;
	std::cin >> str;
	int n;
	std::cin >> n;
	std::cout << removeKdigits(str, n);
	return 0;
}