移掉K位数字

leetcode 402题 [medium]
中:移掉K位数字
英:Remove K Digits
在这里插入图片描述

题解

  1. 算法思路
    (1)数字的大小是由高位(百位相对于十、个位为高位)决定的,所以我们考虑从左到右扫描删除num中的数字;
    (2)当我们删除num中的某一位时,下一位将会代替该位,而要使得最后的数值最小,那么删除位应当具有以下特征:替换位要比删除位

  2. 算法步骤
    (1)从左到右扫描每一位数字,若当前数字比前一数字,则删除前一数字;删除后,当前数字继续与前一数字比较,直到当前数字比前一数字大或者前一数字不存在,则继续扫描下一位。(删除个数满足k则停止
    (2)若num扫描完毕,k仍不为0,则从当前数尾部开始删除数字。(因为此时数满足从左到右每一位单调递增,尾部为最大数字

  3. 核心数据结构:单调递减栈

  4. 时间复杂度:O(n) 遍历一遍num

  5. 空间复杂度:O(n) 单调栈空间

  6. 实现

    /**
     * @param {string} num
     * @param {number} k
     * @return {string}
     */
    var removeKdigits = function(num, k) {
        /**
         * 单调递减栈
         * 时间复杂度:O(n)
         * 空间复杂度:O(n)
         */
        // 预处理(无)
    	
    	// 单调递减栈(栈顶为栈内最大元素)
        let stack = [num[0]];
        let stackTopIdx = 0;
        let i = 1, numLen = num.length;
        // 遍历num
        while(i < numLen && k > 0){
        	// num[i]入栈
            while(num[i] < stack[stackTopIdx]/* 比较会自动进行类型转换 */){
            	// 出栈元素即为需要被删除的元素
                stack.pop();
                stackTopIdx--;
                if(--k === 0) break;	// k === 0 删除结束
            }
            stack.push(num[i++]);
            stackTopIdx++;
        }
        while(k--) stack.pop();
        
        // 构建结果
        let result = stack.join('') + num.slice(i);
        let notZeroHeadIdx = 0;
        while(result[notZeroHeadIdx] === '0') notZeroHeadIdx++;
        return result.slice(notZeroHeadIdx) || "0";
    };
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值