美文网首页
LeetCode 402 移掉K位数字

LeetCode 402 移掉K位数字

作者: 风卷晨沙 | 来源:发表于2019-05-29 15:09 被阅读0次

1.题目

https://leetcode-cn.com/problems/remove-k-digits/

2.题解

这道题是至今为止,我花费时间最多的一道题。回忆我走过的弯路,几乎是把能踩的坑都踩了一遍。第一个坑是移除K位数,K位,我这种较真的程序员就认定了是在字符串中连续的K个数,代码撸完美滋滋,一提交,报错。后来自己又写了一个大坑,就是用String字符串的toCharArray()方法来将String字符串转变为数组,这个就会有一个问题,就是在循环中我就自然使用了 nums[now+1]=nums[now]的写法用在了循环当中。循环本身是nums的长度,我们把这个长度看成是n;我就写了下面这段代码:

        char[] nums = num.toCharArray();
        int i=0;
        int now;
        while (k>0){
            now= i % length;
            char ch = num.charAt(now);
            if(nums[now+1]<nums[now]){
                //例:1下标的位置被0下标的数给替换了。
                nums[now] =nums[now+1];
                k--;
            }
            i++;
        }

结果就是:

image.png
But,这个代码是个啥?于是乎,我仔细又梳理了一遍,最终得偿所愿。
总结完了教训,我们来看看正儿八经的思路是什么样子的。
首先,我们是要去掉K位数,那么先把几种情况列明:
情况一:K<=0 . 返回 num;
情况二:length<=k||length==0。(length = num.length();) 返回 “0”
情况三:排除了情况一、二的其他情况。(主要讨论)
对于情况三,我们主要的思路就是用前一个比较后一个,下标0比较下标1,若前者比后者大则保留前者。否则继续比较。直至把K消耗殆尽。这样就得到了结果。
最后,在判断一下到底有没有前置0。若有n个0,则将取值的下标,往前移动n位即可。

3.代码

class Solution {
    public String removeKdigits(String num, int k) {
         //情况一:k=0
        if(k==0){
            return num;
        }
        //情况二:
        int length = num.length();
        int digits = length - k;
        if(length<=k||length==0){
            return "0";
        }
        //情况三:用K的个数来判断是否已经排除完了;
//        char[] nums = num.toCharArray();
        char[] result = new char[num.length()];
        int top=0;
        int i=0;
        // int now;
        while (i<num.length()){
            // now= i % length;
            char ch = num.charAt(i);
            while (top>0&&result[top-1]>ch&&k>0){
                k--;
                top--;
            }
            i++;//循环用的
            result[top++]=ch;
        }

        //下一步就是 去掉0
        int offset=0;
        while (offset<digits&&result[offset]=='0'){
           offset++;
        }
        //得到结果:
        return offset==digits?"0":new String(result,offset,digits-offset);
    }
}

4.结果截图

402.png

相关文章

  • 力扣每日一题:402.移掉K位数字

    402.移掉K位数字 https://leetcode-cn.com/problems/remove-k-digi...

  • leetcode 402 移掉k位数字

    总结:和单调队列一样,遇到一个数满足弹栈,要弹出前面所有满足条件的元素。 classSolution{ publi...

  • LeetCode 402 移掉K位数字

    1.题目 https://leetcode-cn.com/problems/remove-k-digits/ 2....

  • LeetCode 402. 移掉K位数字

    题目描述 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。注意:num 的...

  • 402. 移掉K位数字

    题目: 402. 移掉K位数字 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字...

  • 402. 移掉K位数字

    题目描述 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。 注意: num...

  • 402. 移掉K位数字

    移除K位数字 题目地址 想法一:动态规划 String num代表了输入的数字。 A.思路: 当处理第n位上的数字...

  • T402、移掉K位数字

    给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。注意:num 的长度小于 ...

  • 算法总览

    1.动态规划 1.leetcode 402:移除k位数字2.leetcode 935骑士拨号器3.leetcode...

  • 栈-N402-移掉K位数字

    题目 概述:给定一个自然数字符串,要求从中移掉K个数,使得剩下的字符所组成的自然数最小 输入:自然数字符串,长度范...

网友评论

      本文标题:LeetCode 402 移掉K位数字

      本文链接:https://www.haomeiwen.com/subject/rmmdtctx.html