[LeetCode]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,


Example
Given an integer A = “178542”, k = 4
return a string “12”


解题思路

贪心的思想,从左到右扫描字符串,如果A[i] > A[i+1]则删除A[i],直至删除了k个数字为止。这样就能使得越小的数字排在最左边,从而使得删除了k个数字后的数最小。

⚠注意两个特殊情况:

  1. 如果扫描了一遍以后,已经删除了的数字(deleted_num)小于k个,甚至是A中所有数字升序排列,没有A[i] > A[i+1]的情况(此时deleted_num = 0),则要删除末尾的(k - deleted_num)个字符。
    eg. 测试样例: A = “12345”, k = 2
  2. 执行了上述算法后,还需进行后处理,删除首位的零。
    eg. 测试样例: A = “90249”, k = 2
    输出应该是“24”,而不是“024”

代码如下:

#include <string>
#include <iostream>

using namespace std;

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 deleted_num = 0;
        int n = A.size();
        if(!A.empty() && n <= 240 && k < n){
            for(auto i = A.begin(); i != A.end() - 1;){
                if(*i > *(i + 1)){
                    A.erase(i);
                    deleted_num++;
                    if(i != A.begin())
                        i--;
                    if(deleted_num == k)
                        break;
                }
                else
                    i++;
            }
            //⚠1
            if(deleted_num < k){
                A.erase(A.end() - (k - deleted_num), A.end());
            }
            //⚠2
            auto i = A.begin();
            while(*i == '0')
                A.erase(i);
        }

        return A;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值