给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
num 的长度小于 10002 且 ≥ k。
num 不会包含任何前导零。
示例 1 :
输入: num = “1432219”, k = 3
输出: “1219”
解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。
示例 2 :
输入: num = “10200”, k = 1
输出: “200”
解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。
示例 3 :
输入: num = “10”, k = 2
输出: “0”
解释: 从原数字移除所有的数字,剩余为空就是0。
唉,打完区域赛就没敲过代码了,思维本来就不行,现在更不行了。。
这其实就是一个单调栈的思维题,维护一个单调递增栈。对于要削减的数字,肯定是要削减大的,靠前的数字。那么我们用单调栈维护栈顶,一直到k减为0。不能有前导零,所以前导零不能进入栈顶。第一次用Leecode,格式好烦人啊。
代码如下:
class Solution {
public:
string removeKdigits(string num, int k) {
stack<char>s;
int len=num.length();
while(!s.empty()) s.pop();
for(int i=0;i<len;i++)
{
while(!s.empty()&&num[i]<s.top()&&k)
{
s.pop();
k--;
}
if(s.empty()&&num[i]=='0') continue;
s.push(num[i]);
}
while(!s.empty()&&k)
{
s.pop();
k--;
}
string x;
while(s.size()) x+=s.top(),s.pop();
reverse(x.begin(),x.end());
if(x.length()==0) return "0";
else return x;
}
};
努力加油a啊,(o)/~