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

你可能感兴趣的文章
NOIP2014 提高组 Day2——寻找道路
查看>>
noip借教室 题解
查看>>
NOIP模拟测试19
查看>>
NOIp模拟赛二十九
查看>>
Vue3+element plus+sortablejs实现table列表拖拽
查看>>
Nokia5233手机和我装的几个symbian V5手机软件
查看>>
non linear processor
查看>>
Non-final field ‘code‘ in enum StateEnum‘
查看>>
none 和 host 网络的适用场景 - 每天5分钟玩转 Docker 容器技术(31)
查看>>
None还可以是函数定义可选参数的一个默认值,设置成默认值时实参在调用该函数时可以不输入与None绑定的元素...
查看>>
NoNodeAvailableException None of the configured nodes are available异常
查看>>
Vue.js 学习总结(16)—— 为什么 :deep、/deep/、>>> 样式能穿透到子组件
查看>>
nopcommerce商城系统--文档整理
查看>>
NOPI读取Excel
查看>>
NoSQL&MongoDB
查看>>
NoSQL介绍
查看>>
NoSQL数据库概述
查看>>
Notadd —— 基于 nest.js 的微服务开发框架
查看>>
NOTE:rfc5766-turn-server
查看>>
Notepad ++ 安装与配置教程(非常详细)从零基础入门到精通,看完这一篇就够了
查看>>