#include<iostream>
#include<string>
#include<stack>
#include<stdio.h>
using namespace std;
string getMinData(string srcData, int delateNums)
{
//思路分析
//题目:一个数字,移除K位,所剩数字最小,
//分析:当一个数高位越小时,该数字的值越小,所以一个数字移除K位数字使值最小时,
//就要尽可能移除高位上比较大的值,用低位上比较小的值顶替掉高位上比较大的值
//eg:
//1432219
//132219 移除一位数字,剩余数字的值最小:用3顶掉4
//12219 再移除一位数字,剩余数字的值最小:用2顶掉3
//1219 再移除一位数字,剩余数字的值最小:用1顶掉2
//移除3位数最小值是1219
stack<int> helperStack;
for (int i = 0; i < srcData.length(); i++)
{
if (helperStack.empty())
{
int currentValue = (srcData[i]) - '0';
if (currentValue == 0) continue;//数字不以0开头
helperStack.push(currentValue);
}
else
{
int currentValue = (srcData[i]) - '0';
if (currentValue > helperStack.top())
{
helperStack.push(currentValue);
}
else
{
while (!helperStack.empty() && currentValue < helperStack.top() && delateNums > 0)
{
helperStack.pop();
delateNums--;
}
if (helperStack.empty() && currentValue == 0) continue;//数字不以0开头
helperStack.push(currentValue);
}
}
}
//循环结束,已经把srcData的每一个字符都进行了入栈尝试,
//判断这时是否删除了delateNums个元素,不够的话从栈顶开始去除delateNums个
while (!helperStack.empty() && delateNums > 0)
{
helperStack.pop();
delateNums--;
}
string result;
while (!helperStack.empty())
{
result += to_string(helperStack.top());
helperStack.pop();
delateNums--;
}
reverse(result.begin(), result.end());
return result;
}
int main()
{
string srcData = "1432219";
int delateNums = 3;
string desData = getMinData(srcData, delateNums);
cout << desData << endl;
}
移掉K位数字
于 2022-04-05 13:00:45 首次发布