使用C++,给定一个n位的正整数d,删除其中任意的k(k≤n)个数字之后,剩下的数字按照原次序排列构成一个新的正整数。对于给定的n位正整数d和正整数k,请运用贪心法设计一个算法,使得删除之后剩下的数字构成的整数最小。其中,函数的返回值类型必须为long
时间: 2025-01-23 13:13:27 浏览: 51
要实现上述功能,可以采用贪心算法来设计 `DelDigit` 函数。以下是具体的实现步骤和代码示例:
### 贪心算法思路
1. **维护一个栈**:用于存储最终结果中的每一位数字。
2. **遍历输入数字的每一位**:
- 如果当前数字比栈顶元素小,并且还可以删除更多的数字(即 `k > 0`),则弹出栈顶元素。
- 将当前数字压入栈中。
3. **处理剩余的删除操作**:如果遍历完所有数字后,还有未使用的删除次数,则从栈顶继续删除。
4. **构造结果**:将栈中的数字依次取出,构造最终的结果。
### 代码实现
```cpp
#include <iostream>
#include <stack>
#include <string>
using namespace std;
long DelDigit(long value, int k) {
string num = to_string(value); // 将数字转换为字符串
stack<char> stk;
for (char digit : num) {
while (!stk.empty() && k > 0 && stk.top() > digit) {
stk.pop();
k--;
}
stk.push(digit);
}
// 处理剩余的删除操作
while (k > 0 && !stk.empty()) {
stk.pop();
k--;
}
// 构造结果
string result;
while (!stk.empty()) {
result = stk.top() + result;
stk.pop();
}
// 去除前导零
size_t pos = result.find_first_not_of('0');
if (pos != string::npos) {
result = result.substr(pos);
} else {
result = "0"; // 全部是0的情况
}
return stol(result); // 将字符串转换回 long 类型
}
int main(void) {
long value;
int k;
cout << "Please enter an integer(3001527):" << endl;
cin >> value; // 输入待删除的整数:3001527
cout << "Please enter the number of digits to be deleted(3):" << endl;
cin >> k; // 输入删除的位数:3
value = DelDigit(value, k); // 调用 DelDigit 函数从 value 删除 k 位得到最小数
cout << "After deletion, The smallest integer is: " << value << endl; // 输出删除后得到的最小数
system("pause");
return 0;
}
```
### 解释
- **栈的使用**:栈用于存储最终结果中的每一位数字,通过比较当前数字与栈顶元素来决定是否弹出栈顶元素。
- **去除前导零**:在构造结果时,需要去掉前导零以保证结果的正确性。
- **字符串转换**:将数字转换为字符串方便逐位处理,最后再将结果字符串转换回 `long` 类型。
这个算法的时间复杂度为 O(n),其中 n 是输入数字的位数。空间复杂度为 O(n),因为最坏情况下栈中会存储所有的数字。
阅读全文
相关推荐


















