用wordpress编写网站,昆山网站备案,关键词seo优化公司,产品设计方案2000字给你一个以字符串表示的非负整数 num 和一个整数 k #xff0c;移除这个数中的 k 位数字#xff0c;使得剩下的数字最小。请你以字符串形式返回这个最小的数字。
示例 1 #xff1a;
输入#xff1a;num 1432219, k 3
输出#xff1a;1219
解…给你一个以字符串表示的非负整数 num 和一个整数 k 移除这个数中的 k 位数字使得剩下的数字最小。请你以字符串形式返回这个最小的数字。
示例 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 。
1 k num.length 105num 仅由若干位数字0 - 9组成除了 0 本身之外num 不含任何前导零
单调栈
比较a和b的大小是从最高位开始进行比较的。 那么我们也应该是从最高位开始进行删数。所以就是对num进行单调上升栈的维护。 逐个数字入栈当发现当前入栈元素栈顶元素s.top()的时候就s.pop()维护栈的单调递增性。 这样就可以保证结果的最高位最小并以此递增。
当所有元素都进行过栈的处理之后如果结果stack中的元素比要保留的长度要长的话则把栈顶元素pop掉。 在入栈的时候可忽略掉前置0.
string removeKdigits(string num, int k) {stackchar s;for (char i num){while (!s.empty() s.top() i k){s.pop();k--;}if (s.empty() i 0)continue;//跳过前置0s.push(i);}string res;while (!s.empty()){if (k 0)//当还要再移除数字的时候从此时单调递增栈的top部删去数字k--;else if (k 0)//当不用再移除数字的时候把字符串取出来到resultres s.top();s.pop(); }reverse(res.begin(), res.end());//stl中的reverse函数return res ? 0 : res;
}用string实现的单调栈
不用初始化一个栈而是直接用string来实现栈的功能维护单调上升的序列。
class Solution {
public:
string removeKdigits(string num, int k)
{string result;for (int i 0; i num.size(); i){while (result.size() kresult.back() num[i]){result.pop_back();k--;}if (result.size() 0 num[i] 0)continue;resultnum[i];}while (k 0 !result.empty()){result.pop_back();k--;}return result ? 0 : result;
}
};