js.移掉 K 位数字

 链接:402. 移掉 K 位数字 - 力扣(LeetCode)

题目:

给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。

 

示例 1 :

输入:num = "1432219", k = 3
输出:"1219"
解释:移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219 。

示例 2 :

输入:num = "10200", k = 1
输出:"200"
解释:移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。

示例 3 :

输入:num = "10", k = 2
输出:"0"
解释:从原数字移除所有的数字,剩余为空就是 0 。

提示:

  • 1 <= k <= num.length <= 105
  • num 仅由若干位数字(0 - 9)组成
  • 除了 0 本身之外,num 不含任何前导零

方法:

首先思考每次移除哪个元素。当是升序时,移除的是最后一个元素。是降序时,移除的是最前的元素。

我的思路是:

让arr栈第一个元素为num[0],arr[s]为栈顶元素,在arr[s]<=num[i],元素进栈。

在arr[s]>num[i],说明栈顶元素大于所遍历到的元素,出栈,并且i--,让下一个栈顶元素继续比较。

有思路后,就需要考虑边界问题和特殊情况。

我的代码还是比较啰嗦的,还可以优化。仅供参考。

代码:

/**

 * @param {string} num

 * @param {number} k

 * @return {string}

 */

var removeKdigits = function(num, k) {

    if(num.length == k) return '0'

    let arr = [num[0]],s = 0

    let i

//遍历num

    for(i = 1;i < num.length ; i++){

        if(k==0) {

            if(!(arr.length==0&&num[i]==0))

            arr.push(num[i]);

            continue;

        }

        // console.log(arr,arr[s],num[i])

        if(s==-1&&num[i]!=0){

            arr.push(num[i]);

            s++; continue;}

        if(arr.length==0&&num[i]==0){

            continue

        }

        if(arr[s]>num[i]){

            arr.pop()

            s--

            i--

            k--

        }else{

        arr.push(num[i])

        s++

        }

    }

    if(i==num.length){

        arr.splice(s-k+1,k)

    }

    // console.log(arr,k)

    return arr.join('')==''?'0':arr.join('')

};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值