博客
关于我
移掉 K 位数字
阅读量:409 次
发布时间:2019-03-06

本文共 1581 字,大约阅读时间需要 5 分钟。


给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小,其中


解题思路

首先我们要了解一个关于数学的前置知识,对于两个相同长度的数字序列,最左边不同的数字决定了这两个数字的大小,例如,对于 A = 1axxxA = 1axxx,B = 1bxxxB = 1bxxx,如果 a > b,则 A > B

基于此,我们可以知道,若要使得剩下的数字最小,需要保证靠前的数字尽可能小

如果使用暴力法,那思路就是:

  • 从左到右遍历
  • 对于每一个遍历到的元素,前一个元素比当前元素大,则丢弃前一个元素,否则保留前一个元素

需要注意的是,如果给定的数字是一个单调递增的数字,那么我们的算法会永远选择不丢弃。这个题目中要求的,我们要永远确保丢弃 k 个数字,因此思路还应该稍加修改:

  • 每次丢弃一次,k 减去 1。当 k 减到 0 ,我们可以提前终止遍历
  • 而当遍历完成,如果 k 仍然大于 0。不妨假设最终还剩下 x 个需要丢弃,那么我们需要选择删除末尾 x 个元素

然而暴力的实现复杂度最差会达到 O(nk)(考虑整个数字序列是单调不降的),因此我们需要加速这个过程

可以用一个栈维护当前的答案序列,栈中的元素代表截止到当前位置,删除不超过 k 次个数字时,所能得到的最小整数。根据之前的讨论:在使用 k 个删除次数之前,栈中的序列从栈底到栈顶单调不降。因此,对于每个数字,如果该数字小于栈顶元素,我们就不断地弹出栈顶元素,直到

  • 栈为空
  • 新的栈顶元素不大于当前数字
  • 已经删除了 k 位数字

上述步骤结束后我们还需要针对一些情况做额外的处理:

  • 如果我们删除了 m 个数字且 m<k,我们需要从序列尾部删除额外的 k-m 个数字
  • 如果最终的数字序列存在前导零,我们要删去前导零
  • 如果最终数字序列为空,我们应该返回 0
class Solution {    public String removeKdigits(String num, int k) {        Deque<Character> deque = new LinkedList<>();        for(int i = 0; i < num.length(); i++) {            while(!deque.isEmpty() && k > 0 && deque.peekLast() > num.charAt(i)) {                deque.pollLast();                k--;            }            deque.offerLast(num.charAt(i));        }        for(int i = 0; i < k; i++) {            deque.pollLast();        }        StringBuilder str = new StringBuilder();        boolean leadingZero = true;        while(!deque.isEmpty()) {            char digist = deque.pollFirst();            if(leadingZero && digist == '0') {                continue;            }            leadingZero = false;            str.append(digist);        }        return str.length() == 0 ? "0" : str.toString();    }}

转载地址:http://jgjkz.baihongyu.com/

你可能感兴趣的文章
Webpack 基本环境搭建
查看>>
mysql5.7 安装版 表不能输入汉字解决方案
查看>>
MySQL5.7.18主从复制搭建(一主一从)
查看>>
MySQL5.7.19-win64安装启动
查看>>
mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
查看>>
MySQL5.7.37windows解压版的安装使用
查看>>
mysql5.7免费下载地址
查看>>
mysql5.7命令总结
查看>>
mysql5.7安装
查看>>
mysql5.7性能调优my.ini
查看>>
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>