[LintCode] Delete Digits [Greedy]

Problem

Given string A representative a positive integer which has N digits, remove any k digits of the number, the remaining digits are arranged according to the original order to become a new positive integer.

Find the smallest integer after remove k digits.

N <= 240 and k <= N,

Example

Given an integer A = "178542", k = 4

return a string "12"

Note

题意为取String A删去k个字符后最小的值,仍以String返回。
使用Greedy的解法如下:
首先通过用字符与'0'相减的结果int cur进行数值大小的比较。然后遍历整个字符串,将较小的元素替换栈内较大元素并放在栈底,形成一个从底部到顶端逐渐增大的堆栈。例如0812743456(不考虑删除元素个数k),堆栈的排列从下到上就变成123456了。又例如087123654,k = 2,那么放入堆栈后就变成0123654
那么,现在就有两种情况:删掉的元素数目小于或等于k。
如果在for循环中正好删除了k个元素,这k个元素一定是从原字符串A的高位(栈底)开始删除的。所以无论删除k个元素之后的元素放入顺序如何,此时栈内元素从底到顶的排列一定是满足条件的最小值。
如果在for循环删除的元素少于k个,一定是这样的情况:081234567, k = 3, 在for循环结束的时候只删除了元素8,因为剩下的元素是一个完全上升序列01234567。这种情况下,就要从堆栈顶部删除剩下的两个元素6和7.
然后,将栈内的元素放入StringBuilder,并将StringBuilder顶部的'0'全部去掉,然后以.toString()返回String

Solution

public class Solution {
    public String DeleteDigits(String A, int k) {
        if (A == null || A.length() < k) return null;
        Stack<Integer> stack = new Stack<Integer>();
        int deleted = 0;
        for (int i = 0; i < A.length(); i++) {
            int cur = A.charAt(i) - '0';
            while (!stack.isEmpty() && stack.peek() > cur && deleted < k) {
                stack.pop();
                deleted++;
            }
            stack.push(cur);
        }
        while (deleted++ < k) stack.pop();
        StringBuilder sb = new StringBuilder();
        while (!stack.isEmpty()) sb.insert(0, stack.pop());
        while (sb.charAt(0) == '0') sb.deleteCharAt(0);
        return sb.toString();
    }
}
内容概要:本文介绍了多种开发者工具及其对开发效率的提升作用。首先,介绍了两款集成开发环境(IDE):IntelliJ IDEA 以其智能代码补全、强大的调试工具和项目管理功能适用于Java开发者;VS Code 则凭借轻量级和多种编程语言的插件支持成为前端开发者的常用工具。其次,提到了基于 GPT-4 的智能代码生成工具 Cursor,它通过对话式编程显著提高了开发效率。接着,阐述了版本控制系统 Git 的重要性,包括记录代码修改、分支管理和协作功能。然后,介绍了 Postman 作为 API 全生命周期管理工具,可创建、测试和文档化 API,缩短前后端联调时间。再者,提到 SonarQube 这款代码质量管理工具,能自动扫描代码并检测潜在的质量问题。还介绍了 Docker 容器化工具,通过定义应用的运行环境和依赖,确保环境一致性。最后,提及了线上诊断工具 Arthas 和性能调优工具 JProfiler,分别用于生产环境排障和性能优化。 适合人群:所有希望提高开发效率的程序员,尤其是有一定开发经验的软件工程师和技术团队。 使用场景及目标:①选择合适的 IDE 提升编码速度和代码质量;②利用 AI 编程助手加快开发进程;③通过 Git 实现高效的版本控制和团队协作;④使用 Postman 管理 API 的全生命周期;⑤借助 SonarQube 提高代码质量;⑥采用 Docker 实现环境一致性;⑦运用 Arthas 和 JProfiler 进行线上诊断和性能调优。 阅读建议:根据个人或团队的需求选择适合的工具,深入理解每种工具的功能特点,并在实际开发中不断实践和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值