题解 | 移掉 K 位数字

import java.util.*;

/**
 * NC219 移掉 K 位数字
 * @author d3y1
 */
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param num string字符串
     * @param k int整型
     * @return string字符串
     */
    public String removeKnums (String num, int k) {
        // return solution1(num, k);
        // return solution2(num, k);
        return solution3(num, k);
    }

    /**
     * 单调栈+贪心
     * @param num
     * @param k
     * @return
     */
    private String solution1(String num, int k){
        if(k >= num.length()){
            return "0";
        }

        Stack<Character> stack = new Stack<>();
        for(char digit: num.toCharArray()){
            // 单调栈(单调增)
            while(!stack.isEmpty() && digit<stack.peek() && k>0){
                // 贪心
                stack.pop();
                k--;
            }
            stack.push(digit);
        }

        // 继续移除
        while(k-- > 0){
            if(!stack.isEmpty()){
                stack.pop();
            }
        }

        // 保存结果
        StringBuilder sb = new StringBuilder();
        while(!stack.isEmpty()){
            sb.insert(0, stack.pop());
        }

        // 去掉前导0
        String result = sb.toString();
        if(result.startsWith("0")){
            int index;
            for(index=0; index<result.length(); index++){
                if(result.charAt(index) != '0'){
                    break;
                }
            }
            if(index < result.length()){
                result = result.substring(index);
            }else{
                result = "0";
            }
        }

        return result;
    }

    /**
     * 单调栈+贪心
     * @param num
     * @param k
     * @return
     */
    private String solution2(String num, int k){
        int n = num.length();
        if(k >= n){
            return "0";
        }

        Deque<Character> stack = new ArrayDeque<>();

        for(char ch: num.toCharArray()){
            // 单调栈(单调增)
            while(!stack.isEmpty() && stack.peekLast()>ch && k>0){
                // 贪心
                stack.pollLast();
                k--;
            }
            stack.offerLast(ch);
        }

        // 继续移除
        while(!stack.isEmpty() && k>0){
            stack.pollLast();
            k--;
        }

        // 去掉前导0
        while(!stack.isEmpty() && stack.peekFirst()=='0'){
            stack.pollFirst();
        }

        // 保存结果
        StringBuilder sb = new StringBuilder();
        while(!stack.isEmpty()){
            sb.append(stack.pollFirst());
        }

        return sb.length()==0?"0":sb.toString();
    }

    /**
     * 单调栈+贪心
     * @param num
     * @param k
     * @return
     */
    private String solution3(String num, int k){
        int n = num.length();
        if(k >= n){
            return "0";
        }

        Deque<Character> stack = new ArrayDeque<>();

        for(char ch: num.toCharArray()){
            // 单调栈(单调增)
            while(!stack.isEmpty() && stack.peekLast()>ch && k>0){
                // 贪心
                stack.pollLast();
                k--;
            }
            stack.offerLast(ch);
        }

        // 继续移除
        while(!stack.isEmpty() && k>0){
            stack.pollLast();
            k--;
        }

        // 保存结果
        StringBuilder sb = new StringBuilder();
        while(!stack.isEmpty()){
            sb.append(stack.pollFirst());
        }

        // 去掉前导0
        String result = sb.toString().replaceFirst("^0+", "");

        return "".equals(result)?"0":result;
    }
}

全部评论

相关推荐

在数字化时代,网络安全至关重要。搞定网络安全岗位的offer,不仅需要扎实的技术基础,还需要敏锐的安全意识和丰富的实战经验。本文将为你提供搞定网络安全岗位offer的实用建议,帮助你在竞争激烈的市场中脱颖而出,成功守护数字世界的安宁。网络安全行业的求职者需要具备扎实的技术基础,这是搞定安全岗位offer的关键。精通网络安全的基本概念,如加密技术、身份认证和访问控制,是必备技能。同时,掌握网络协议、操作系统安全和漏洞分析等高级知识,能够让你在面试中脱颖而出。例如,熟悉Linux系统的安全配置和漏洞修复,能够帮助你应对实际工作中的复杂问题,增加搞定offer的机会。实战经验是搞定网络安全岗位offer的重要加分项。通过参与CTF(Capture&nbsp;The&nbsp;Flag)竞赛、渗透测试项目或安全漏洞挖掘,积累实际操作经验,能够展示你的技术实力和问题解决能力。例如,成功完成一次企业网络的渗透测试,不仅能提升你的技术水平,还能为简历增添亮点,让雇主对你刮目相看,从而增加搞定offer的可能性。了解行业动态和法规政策也是搞定网络安全岗位offer的重要环节。网络安全行业受到严格的法律法规监管,熟悉相关法规,如《网络安全法》和《数据安全法》,能够让你在工作中避免法律风险。同时,关注行业动态,了解最新的安全威胁和防护技术,能够帮助你在面试中展现出对行业的深刻理解,提高搞定offer的概率。建立人脉关系同样重要。参加网络安全会议、技术研讨会和行业社交活动,结识行业专家和从业者。他们不仅能提供宝贵的建议和信息,还可能为你推荐工作机会。通过与同行交流,了解行业趋势和求职经验,能够让你在求职过程中更加从容,最终成功搞定网络安全岗位的offer。#牛客AI配图神器#
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务