LeetCode Remove K Digits

LeetCode Remove K Digits

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.

给定一个数字字符串,要求从中删除k个数字,使得最终结果最小,返回最小的数字字符串。

使用栈和贪心的思路。为了使结果尽量小,我们从左往右扫描字符串,把字符存到一个栈中,如果当前字符比栈顶小,则可以把栈顶数字删掉,这样相当于用当前字符代替栈顶字符所在位置,使得结果更小了。否则把当前字符压栈,注意此时不能把当前字符删掉,因为可能后面还有更大的字符出现。

如果这样过了一遍之后,还是没删够k个字符,此时,字符串从左往右肯定是非降序的。所以我们依次弹栈,把栈顶的元素删掉,直到删够k个字符。

最后还要判断一下剩余字符串是否为空,并删除前导零。完整代码如下:

class Solution {
public:
	string removeKdigits(string num, int k) {
		if (k >= num.size())return "0";
		string ans = "";
		for (const auto& c : num) {
			if (ans.empty() || k == 0)ans.push_back(c);
			else {
				while (!ans.empty() && ans.back() > c) {
					ans.pop_back();
					if (--k == 0)break;
				}
				ans.push_back(c);
			}
		}
		while (k-- > 0 && !ans.empty()) ans.pop_back();
		while (!ans.empty() && ans[0] == '0')ans.erase(ans.begin());
		return ans.empty() ? "0" : ans;
	}
};

本代码提交AC,用时6MS。

Leave a Reply

Your email address will not be published. Required fields are marked *