删除 k 位数字,得到最小的数 (使用c++实现) 【题目描述】 输入一个数字串 N,长度不超过 250 位,去掉其中任意 k 个数字后剩下的数字按 原左右次序将组成一个新的整数,要求组成新的整数最小。 【输入格式】 输入两行正整数。 第一行输入一个高精度的正整数 n。 第二行输入一个正整数 k,表示需要删除的数字个数。 【输出格式】 输出一个整数,最后剩下的最小数。 【样例输入】(测试数据不包含本样例) 175438 4 【样例输出】 13
时间: 2024-04-16 13:28:02 浏览: 136
可以使用贪心算法来解决这个问题。思路是从左到右遍历数字串,每次删除当前位置数字后,选择删除后的数字串中最小的数字作为下一个位置的数字。具体实现如下:
```cpp
#include <iostream>
#include <string>
#include <vector>
std::string removeDigits(const std::string& num, int k) {
std::vector<char> stack;
// 遍历数字串
for (char digit : num) {
// 当前数字比栈顶数字小,且还有剩余删除次数
while (!stack.empty() && k > 0 && stack.back() > digit) {
stack.pop_back();
k--;
}
stack.push_back(digit);
}
// 删除剩余的数字
while (k > 0) {
stack.pop_back();
k--;
}
// 构造结果字符串
std::string result;
bool leadingZero = true; // 是否处于结果的前导零位置
for (char digit : stack) {
if (leadingZero && digit == '0') {
continue; // 忽略前导零
}
leadingZero = false;
result += digit;
}
return result.empty() ? "0" : result;
}
int main() {
// 读取输入
std::string num;
int k;
std::cin >> num >> k;
// 删除数字并输出结果
std::string result = removeDigits(num, k);
std::cout << result << std::endl;
return 0;
}
```
你可以使用该代码来实现你的需求。代码使用了一个栈来记录删除数字后的结果。遍历数字串时,如果当前数字比栈顶数字小,且还有剩余删除次数,将栈顶数字出栈。删除完指定次数的数字后,将栈中的数字构造为结果字符串。注意,代码还处理了结果字符串中的前导零。如果最终结果为空字符串,则输出"0"。
阅读全文