leetcode 402. Remove K Digits(删除K个数字)
Given a non-negative integer num represented as a string,
remove k digits from the number so that the new number is the smallest possible.
Note:
The length of num is less than 10002 and will be ≥ k.
The given num does not contain any leading zero.
Example 1:
Input: num = “1432219”, k = 3
Output: “1219”
Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest.
Example 2:
Input: num = “10200”, k = 1
Output: “200”
Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes.
Example 3:
Input: num = “10”, k = 2
Output: “0”
Explanation: Remove all the digits from the number and it is left with nothing which is 0.
给出一个string表示的数字,删掉其中的k位数,使得剩下的数字是最小的
思路:
情形1: 找降序的数字,
比如第一个例子1432219,43是讲序组合,所以删掉4,然后32是降序,所以删掉3,以此类推
k=3,删掉4,3,2后剩1219
情形2: 全是升序的情况,比如123456789,就从后面开始删除k位
如果是升序,就保存到结果
情形3(出错点):
1234567890的情况,k=9,这时候发现降序(“90”),而此时结果中已保存“12345678”
这时候循环k次,直到删完所有的降序之后,再保存0到结果中
情形4:
删除后size为0,这时候需要返回“0”
情形5:
删除k个后结果数字开头是“0”,见第二个例子,这时候要循环删除开头的0
代码
#include <iostream>
using namespace std;
string rmkdits(string s, int k) {
string res;
if(s.size()==k) {
return "0";
}
for(int i=0;i<s.size();i++) {
while(i>0 && res.size()>0 && res[res.size()-1]>s[i] && k>0) { // 1432219 1234567890
res.erase(res.size()-1,1);
cout<<res<<endl;
k--;
}
res+=s[i];
}
if(res.size()==s.size()) {
res=s.substr(0,s.size()-k);
}
while(res.size()>1 && res[0]=='0') {
res.erase(0,1);
}
return res;
}
int main() {
string s;
cin>>s;
int k;
cin>>k;
s=rmkdits(s,k);
cout<<s<<endl;
system("pause");
return 0;
}