博客
关于我
LeetCode 402. 移掉K位数字 java题解
阅读量:752 次
发布时间:2019-03-23

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

分析数字字符串去除相邻递减数字问题

题目描述

任务要求去除输入数字字符串中连续出现的相邻递减数字。具体规则如下:
- 游戏结果返回字符串,必须去除k个相邻递减数字。 - 如果输入数字已经按顺序排列,要达到丢弃k个相邻递减数字的目标,应去掉末尾k个字符。

思路分析

这是一个常见的问题,需要遍历数字字符串,判断相邻数字是否递减。如果发现递减情况,就将该相邻对记录下来,最后决定保留前几项,去掉后面的k个递减对。
优化思路:为了减少递归或多次遍历带来的时间复杂度,可以使用栈数据结构,逐字符扫描,维护一个递减计数器。当遇到递减的情况时,记录k的值,并进行必要的跳过处理。

时间复杂度分析

该方法的核心逻辑使用了一个栈来跟踪递减数字。每个数字最多被处理两次(入栈和出栈),由于内层循环的次数等于数字的长度N,因此时间复杂度为O(N)。
空间复杂度方面,栈存储了所有需要处理的N个数字,因此空间复杂度为O(N)。

代码实现

            public class Solution {                public String removeKdigits(String num, int k) {                    if (num == null || num.isEmpty()) {                        return "";                    }                    if (k == 0) {                        return num;                    }                    if (k >= num.length()) {                        return "0";                    }                    // 以实际字符长度为目标                    int targetLength = num.length() - k;                    LinkedList
stack = new LinkedList<>(); for (int i = 0; i < num.length(); i++) { char c = num.charAt(i); // 如果发现前一位大于后一位,则弹出前一位 // 并减少k的数量 while (!stack.isEmpty() && stack.peekLast() > c && k > 0) { stack.removeLast(); k--; } stack.addLast(c); } // 防止结果中有前导零,需要记录是否已经遇到了非零数字 int leadingZeroCount = 0; StringBuilder result = new StringBuilder(targetLength); for (Character c : stack) { if (result.length() == targetLength) { break; } if (leadingZeroCount == targetLength) { result.append(c); leadingZeroCount--; } else if (c == '0' && leadingZeroCount < targetLength) { // 还是前导零,继续跳过 continue; } else { if (c != '0') { leadingZeroCount++; } result.append(c); } } if (result.length() == 0) { return "0"; } return result.toString(); } }

测试示例结果

示例执行结果

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

你可能感兴趣的文章
Mysql学习总结(82)——MySQL逻辑删除与数据库唯一性约束如何解决?
查看>>
Mysql学习总结(83)——常用的几种分布式锁:ZK分布式锁、Redis分布式锁、数据库分布式锁、基于JDK的分布式锁方案对比总结
查看>>
Mysql学习总结(84)—— Mysql的主从复制延迟问题总结
查看>>
Mysql学习总结(85)——开发人员最应该明白的数据库设计原则
查看>>
Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解
查看>>
Mysql学习总结(9)——MySql视图原理讲解与使用大全
查看>>
Mysql学习笔记 - 在Centos7环境下离线安装Mysql
查看>>
MySQL学习笔记十七:复制特性
查看>>
Mysql学习第一课-mysql的定义及sql语句
查看>>
mysql安全模式: sql_safe_updates
查看>>
mysql安装,卸载,连接
查看>>
MySQL安装之没有配置向导
查看>>
mysql安装出现 conflicts with mysql*的解决办法
查看>>
mysql安装卡在最后一步解决方案(附带万能安装方案)
查看>>
mysql安装和启动命令小结
查看>>
Mysql安装教程(命令行)
查看>>
mysql安装版安装
查看>>
MySQL安装配置教程(非常详细),从零基础入门到精通,看完这一篇就够了
查看>>
mysql安装配置简介
查看>>
MySQL定义和变量赋值
查看>>