<LeetCode每日一题>402移掉K位数字

题目描述
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
●num 的长度小于 10002 且 ≥ k。
●num 不会包含任何前导零。
示例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。

问题分析
没想出来咋做的,在看了相关题解后大致明白了,参考链接如下:

一招吃遍力扣四道题,妈妈再也不用担心我被套路啦~
【402】C++ 详细解析 一般方法&单调栈方法 移掉k位数字

代码实现
通过维护一个单调递增栈实现输出数组的存储。对于num中的每一位数字在进栈前与栈顶元素进行对比,若比栈顶数字大则进栈,弱小与栈顶数字,则将当前栈顶元素弹出,并再次与新栈顶元素进行比对,直到num中每一位数字全部比对完退出。

具体代码如下所示:

public String removeKdigits(String num, int k) {
       String ans = null;
        int n;//保留位数
        n=num.length()-k;
        Stack<Character> stack =new Stack();
       // int size=0;//栈当前容量
        for(int i=0;i<num.length();i++) {
            while (stack.size() != 0 && num.charAt(i) < stack.peek()&&k>0) {
                //stack.push(num.charAt(i));
                stack.pop();
                k--;
            }
            if(num.charAt(i)=='0'&&stack.size()==0)
            {
                continue;
            }
            stack.push(num.charAt(i));
           // size=stack.size();
    }
        char res[]=new char[stack.size()];
        //int m=n;
        while(stack.size()>0)
        {
            res[stack.size()-1]=stack.pop();
        }
        if(n==0||res.length==0)
        {
            return "0";
        }
        if(res.length>=n) {
            ans = new String(res, 0, n);
        }
        else
        {
            ans=new String(res);
        }
        return ans;
  }

运行调试
虽然学习了相关解题思路后明白了解题方法,但在具体代码的编写过程中仍遇到了很大的困难。在一开始,我错误的将num中的当前位数字与前一位数字进行比大小,然后进行出入栈操作,这导致了对于输入为n=“123045”,k=3,此种情况下得不出正确的结果,0仅能将3弹出,但2仍在栈中。
之后我改用while循环进行比对,但在控制pop()操作的执行次数时出现错误,若输入为n=“987654”,k=3,此种情况下前一数字进栈后会被后一数字弹出,从而当for循环结束后栈中仅剩一位数字。后我在while循环中增设了判断k>0的条件,仅当满足该条件才可以执行循环。这就很好的解决了数字全被弹出的问题。
最后阶段的调试,我又遇到了当栈底元素为0、栈为空栈等问题,后我通过增设了一些对res.length和n之间的判断条件得以解决。

附上提交记录,实践证明,编程能力仅靠上课听讲以及课程实验是远远不够的,难度为中等的题就花费了我很长的时间。菜十原罪啊!!!
<LeetCode每日一题>402移掉K位数字_第1张图片

运行结果
<LeetCode每日一题>402移掉K位数字_第2张图片

你可能感兴趣的:(数据结构,算法,java,leetcode)