[leetcode]Remove K Digits
链接:https://leetcode.com/problems/remove-k-digits/description/
Question
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.
Solution
// 如果一个数字比较大又处在高位,那么应该移除
class Solution {
public:
string removeKdigits(string num, int k) {
// 注意返回空的字符串应该是唯一的字符串 "0"
if (k >= num.size()) return "0";
int i = 0;
stack<char> mystack;
while (i < num.size()) {
while (!mystack.empty() && k > 0 && mystack.top() > num[i]) {
mystack.pop();
k--;
}
mystack.push(num[i]);
i++;
}
while (k > 0 && !mystack.empty()) {
mystack.pop();
k--;
}
string str;
while (!mystack.empty()) {
char c = mystack.top(); mystack.pop();
str.push_back(c);
}
reverse(str.begin(), str.end());
string res;
bool first = true;
for (int i = 0; i < str.size(); i++) {
if (str[i] == '0') {
if (!first) {
res.push_back(str[i]);
}
} else {
first = false;
res.push_back(str[i]);
}
}
// 说明全部是0
if (first) return "0";
return res;
}
};
思路:从头开始遍历字符串,第一个数字直接压入,后面的数字如果比栈顶的小,将栈顶元素持续压出知道此时的栈顶元素小于该数字,并将数字压入,一直持续指导压出了k个数字或者是遍历完字符串了。如果后面没有删够k个字符,则从后面开始删,知道删够为止。