402. 移掉K位数字
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
- num 的长度小于 10002 且 ≥ k。
- num 不会包含任何前导零。
可以看出来这道题是要使用栈的数据结构处理的,但是感觉还是没怎么写好,C++的代码如下(感觉写得很啰嗦):
class Solution {
public:
string removeKdigits(string num, int k) {
vector<int> IntNum;
string result="";
for(int i=0;i<num.length();i++)
{
int Num=num[i]-'0';
while(IntNum.size()!=0 && IntNum[IntNum.size()-1]>Num && k>0)
{
IntNum.pop_back();
k--;
}
if(Num!=0||IntNum.size()!=0)
{
IntNum.push_back(Num);
}
}
while(IntNum.size()!=0&&k>0)
{
IntNum.pop_back();
--k;
}
for(int i=0;i<IntNum.size();i++)
{
result.append(1,IntNum[i]+'0');
}
if(result=="")
{
result="0";
}
return result;
}
};
运行效果:
在看了官方答案后,我发现我用各种if判断是多么愚蠢的事情(ε=(´ο`*)))唉),具体的代码实现如下(Python版):
class Solution:
def removeKdigits(self, num: str, k: int) -> str:
myStack=[]
for i in num:
while len(myStack) and ord(myStack[-1]) > ord(i) and k > 0:
myStack.pop()
k-=1
myStack.append(i)
if k>0:
myStack=myStack[:-k]
result=""
for i in myStack:
if i is '0' and len(result) is 0:
continue
result+=i
return "0" if result is "" else result
运行效果:
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/remove-k-digits