博客
关于我
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/

你可能感兴趣的文章
node.js url模块
查看>>
Node.js Web 模块的各种用法和常见场景
查看>>
Node.js 之 log4js 完全讲解
查看>>
Node.js 函数是什么样的?
查看>>
Node.js 函数计算如何突破启动瓶颈,优化启动速度
查看>>
Node.js 切近实战(七) 之Excel在线(文件&文件组)
查看>>
node.js 初体验
查看>>
Node.js 历史
查看>>
Node.js 回调函数的原理、使用方法
查看>>
Node.js 在个推的微服务实践:基于容器的一站式命令行工具链
查看>>
Node.js 实现类似于.php,.jsp的服务器页面技术,自动路由
查看>>
Node.js 异步模式浅析
查看>>
node.js 怎么新建一个站点端口
查看>>
Node.js 文件系统的各种用法和常见场景
查看>>
Node.js 模块系统的原理、使用方式和一些常见的应用场景
查看>>
Node.js 的事件循环(Event Loop)详解
查看>>
node.js 简易聊天室
查看>>
Node.js 线程你理解的可能是错的
查看>>
Node.js 调用微信公众号 API 添加自定义菜单报错的解决方法
查看>>
node.js 配置首页打开页面
查看>>