算法分析与设计第十六周

这里写图片描述

分析:每次移除一个数,要尽可能使前面的数最小,因为前面的数的权值最大。而删除一个数,会导致后面紧接着的一个数代替删除的数的位置。所以在一次移除操作中,从前往后检查,一旦发现某个数后继的数更小,则删除此数。复杂度为o(k*n),可以采用递归的方法实现。(然而递归代码LeetCode显示内存超出,应该是栈溢出了,本地测试没问题。下面先给出递归代码,后面再给出迭代方法)

递归代码

class Solution {
public:
    string removeKdigits(string num, int k) {

        if (k == 0)
            return num == "" ? "0" : num;

        if (num.length() == k)
            return "0";

        if (num == "")
            return "0";

        string next = "";

        for (int i = 0; i < num.length() - 1;)
        {
            if (num[i + 1] >= num[i])
            {
                next += num[i];
                ++i;
            }
            else
            {
                ++i;

                while (i < num.length())
                {
                    next += num[i];
                    ++i;
                }

               // break;
            }

        }

        int i ;

        //消除前导0
        for (i = 0; i < next.length() && next[i] == '0'; ++i);

        next = next.substr(i);

        return removeKdigits(next, k - 1);

    }
};

迭代代码:

class Solution {
public:
    string removeKdigits(string num, int k) {


        if (num.length() == k || num == "")
            return "0";

        if (k == 0)
            return num;


        int len = num.length();

        while (k-- > 0)
        {
             string next = "";

        for (int i = 0; i < len - 1;)
        {
            if (num[i + 1] >= num[i])
            {
                next += num[i];
                ++i;
            }
            else
            {
                ++i;

                while (i < num.length())
                {
                    next += num[i];
                    ++i;
                }

               // break;
            }

        }

        int j ;

        for (j = 0; j < next.length() && next[j] == '0'; ++j);

        next = next.substr(j);
        len = next.length();
        num = next;

        }

        return num == "" ? "0" : num;

    }
};

通过截图
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值