假设我们有一个以字符串表示的非负整数num,我们必须从该数字中删除k个数字,以便使新数字最小。因此,如果输入像“ 1432219”并且k = 3,那么结果将是“ 1219”。
为了解决这个问题,我们将遵循以下步骤-
定义一个堆栈st,创建一个空字符串ret
n:= num的大小
对于i,范围为0至n – 1
从堆栈中删除并将k减1
而k为非零且堆栈不为空且堆栈顶部> num [i]
将num [i]插入st
当k不为0时,从堆栈中删除元素
当堆栈不为空时
ret:= ret +栈顶,从栈中删除元素
现在反转ret字符串
ans:=一个空字符串,而i:= 0
当我<ret的大小,而ret [i]不是'0'时
使我增加1
因为我<视网膜的大小
ans:= ans + ret [i]
ret:= ans
如果ret的大小为0,则返回“ 0”,否则返回
让我们看下面的实现以更好地理解-
class Solution { public: string removeKdigits(string num, int k) { stack st; string ret = ""; int n = num.size(); for(int i = 0; i < n; i++){ while(k && !st.empty() && st.top() > num[i]){ st.pop(); k--; } st.push(num[i]); } while(k--)st.pop(); while(!st.empty()){ ret += st.top(); st.pop(); } reverse(ret.begin(), ret.end()); string ans = ""; int i = 0; while(i <ret.size() && ret[i] == '0')i++; for(; i < ret.size(); i++)ans += ret[i]; ret = ans; return ret.size() == 0? "0" : ret; } };
"1432219" 3
输出结果
"1219"