在C ++中删除K位

假设我们有一个以字符串表示的非负整数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”,否则返回

    范例(C ++)

    让我们看下面的实现以更好地理解-

    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"