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

你可能感兴趣的文章
OpenCV学习(13) 细化算法(1)(转)
查看>>
OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
查看>>
OpenCV学堂 | CV开发者必须懂的9种距离度量方法,内含欧氏距离、切比雪夫距离等(建议收藏)
查看>>
OpenCV学堂 | OpenCV中支持的人脸检测方法整理与汇总
查看>>
OpenCV学堂 | OpenCV案例 | 基于轮廓分析对象提取
查看>>
OpenCV学堂 | YOLOv8与YOLO11自定义数据集迁移学习效果对比
查看>>
OpenCV学堂 | YOLOv8官方团队宣布YOLOv11 发布了
查看>>
OpenCV学堂 | YOLOv8实战 | 荧光显微镜细胞图像检测
查看>>
OpenCV学堂 | 汇总 | 深度学习图像去模糊技术与模型
查看>>
OpenCV安装
查看>>
OpenCV官方文档 理解k - means聚类
查看>>
opencv实现多路播放
查看>>
opencv常用函数
查看>>
OpenCV探索
查看>>
OpenCV添加中文(五)
查看>>
opencv源码查看
查看>>
OpenCV点目标检测未找到所有目标,并且找到的圆圈偏移
查看>>
opencv特征提取1-Harris角点检测
查看>>
OpenCV环境搭建(一)
查看>>
OpenCV的视频读取
查看>>