给定一个正整数 NUM1,计算出一个新的正整数 NUM2,其中 NUM2 是通过从 NUM1 中移除 N 位数字得到的结果,并且需要保证 NUM2 的值最小。
要在给定的数字字符串中移除 N 位数字,使得剩下的数字组成的数尽可能小。这个问题可以通过贪心算法来解决。具体步骤如下:
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main(){
string num;
int k;
// 读取输入
cin >> num;
cin >> k;
int n = num.length();
// 使用栈保存结果数字
string result = "";
int remove = k;
for(char c : num){
// 当当前数字小于结果最后一位,且还有移除机会时,弹出最后一位
while(!result.empty() && result.back() > c && remove > 0){
result.pop_back();
remove--;
}
result += c;
}
// 如果还有移除次数,移除末尾
while(remove > 0){
result.pop_back();
remove--;
}
// 去除前导零
size_t start = 0;
while(start < result.size()-1 && result[start] == '0') start++;
result = result.substr(start);
cout << result;
return 0;
}
# 读取输入
num = input().strip()
k = int(input())
result = []
remove = k
for c in num:
# 当当前数字小于栈顶数字,且还有移除机会时,弹出栈顶
while result and result[-1] > c and remove > 0:
result.pop()
remove -= 1
result.append(c)
# 如果还有移除次数,移除末尾
if remove > 0:
result = result[:-remove]
# 转为字符串并去除前导零
result_str = ''.join(result).lstrip('0')
# 如果结果为空,则返回 '0'
print(result_str if result_str else '0')
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String num = sc.next();
int k = sc.nextInt();
StringBuilder result = new StringBuilder();
int remove = k;
for(char c : num.toCharArray()){
// 当当前数字小于结果最后一位,且还有移除机会时,弹出最后一位
while(result.length() > 0 && result.charAt(result.length()-1) > c && remove > 0){
result.deleteCharAt(result.length()-1);
remove--;
}
result.append(c);
}
// 如果还有移除次数,移除末尾
while(remove > 0){
result.deleteCharAt(result.length()-1);
remove--;
}
// 去除前导零
int start = 0;
while(start < result.length()-1 && result.charAt(start) == '0') start++;
String finalResult = result.substring(start);
System.out.println(finalResult);
}
}
给一个正整数 NUM1 ,计算出新正整数 NUM2 ,NUM2 为 NUM1 中移除 N 位数字后的结果,需要使得 NUM2 的值最小。
输入的第一行为一个字符串,字符串由 0−9 字符组成,记录正整数 NUM1,NUM1 长度小于 32。
输入的第二行为需要移除的数字的个数,小于 NUM1 长度。
输出一个数字字符串,记录最小值 NUM2 。
输入
2615371
4
输出
131
NUM2可能有前导0,如果有则需要去除