Delete Digits

Given string A representative a positive integer which has N digits, remove any k digits of the number, the remaining digits are arranged according to the original order to become a new positive integer.

Find the smallest integer after remove k digits.

N <= 240 and k <= N,

xample

Given an integer A = "178542", k = 4

return a string "12"

首先要理解题目的意思,题目是说在原整数的顺序基础上删除,删除之后要保留之前的顺序。那如何才能确定某个数该删除,假如有个整数453,现在要删除一个元素,如何选择删除一个元素使得数最小,我们人工会选择删除5,得到43;那为什么这样删除可以保证得到满足题意的结果,假如现在在位置4处,如果删除4会使得到53,如果不删除4,删除5,会得到43,也就是说对于i位置的数a[i] <= a[i + 1], 那么不应该删除i处的数,因为删除i处的数比删除i+1处的数更大,所以不能删除第i处的数;反之则应该删除;这样就有了如何确定某个数是否应该删除的数学依据。在实现的时候,很多细节需要考虑。

class Solution {
public:
    /**
     *@param A: A positive integer which has N digits, A is a string.
     *@param k: Remove k digits.
     *@return: A string
     */
    
    string DeleteDigits(string A, int k) {
        // wirte your code here
        int lenA = A.size();
        if(lenA < k || lenA == k)
            return "";
        if(k <= 0)
            return A;
        string ans = "";
        int index = 0;
        while(index < lenA){
            if(index < (lenA - 1)){
                if(A[index] <= A[index + 1])
                {
                    if(ans.size() > 0 || A[index] != '0')
                        ans.push_back(A[index]);
                }
                else if(A[index] > A[index + 1] && k > 0){
                    --k;
<span style="white-space:pre">		</span>    //对于之前没有删除的数,需要检查是否也要删除
                    while(ans.size() && k > 0 && ans[ans.size() - 1] > A[index + 1]){
                        --k;
                        ans.pop_back();
                    }
                }
                else
                    ans.push_back(A[index]);
            }
            else
                ans.push_back(A[index]);
            ++index;
        }
        
        //如果出现了ans为递增序列,而且删除数不够,则直接从ans后面删除较大的数
        while(k > 0){
            ans.pop_back();
            --k;
        }
        return ans;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值