LeetCode 2296.设计一个文本编辑器

news/2024/12/22 15:09:41/

比较暴力的解法,使用StringBuilder来模拟字符串的变化,完全数学化去理解,但性能会差一些,在题解区看到了有人提到了对顶栈。看了几篇介绍帖子,试着写了下,确实写起来更简单。
参考链接:对顶栈图解

class TextEditor {/*** 使用对顶栈解决字符移动问题:* 一左一右两个栈left、right相对,添加时将字符串中字符都从队尾加入left栈* 删除时,将left栈中的字符从队尾移除Math.min(left.size(), k)个字符* 左移时,将需要移除的字符(数量为Math.min(left.size(), k))从left栈队尾取出并从队头放入right栈* 右移时,将需要移除的字符(数量为Math.min(right.size(), k))从right栈队头取出并从队位放入left栈*/private LinkedList<Character> left = null;private LinkedList<Character> right = null;/*** 初始化*/public TextEditor() {left = new LinkedList<>();right = new LinkedList<>();}/*** 将 text中字符逐个从left栈队尾放入* @param text 要入left栈的字符串*/public void addText(String text) {for (Character c : text.toCharArray()){left.addLast(c);}}/*** 删除光标左边 k 个字符。返回实际删除的字符数目。* 将left栈中的字符从队尾移除Math.min(left.size(), k)个字符* @param k 输入数字k* @return 实际删除的字符数量*/public int deleteText(int k) {int count = Math.min(left.size(), k);for (int i = 0; i < count; i++) {left.removeLast();}return count;}/*** 将光标向左移动 k 次。返回移动后光标左边 min(10, len) 个字符,其中 len 是光标左边的 字符数目。* 左移时,将需要移动的字符(数量为Math.min(left.size(), k))从left栈队尾取出并从队头放入right栈* @param k 输入数字k* @return  返回移动字符组成的字符串*/public String cursorLeft(int k) {int count = Math.min(left.size(), k);for (int i = 0; i < count; i++) {Character character = left.removeLast();right.addFirst(character);}return getLeftKCharacters(k);}/*** 将光标向右边移动 k 次。返回移动后光标左边 min(10, len) 个字符,其中 len 是光标左边的 字符数目。** @param k 输入数字k* @return  返回移动字符组成的字符串*/public String cursorRight(int k) {int count = Math.min(right.size(), k);for (int i = 0; i < count; i++) {Character character = right.removeFirst();left.addLast(character);}return getLeftKCharacters(k);}/*** 从队尾逐个获取left栈中的Math.min(left.size(),k)个字符* @param k 输入数字k* @return  返回取出字符组成的字符串*/public String getLeftKCharacters(int k) {int len = Math.max(left.size() - 10,0);StringBuilder str = new StringBuilder();for (int i = len; i < left.size() ; i++) {str.append(left.get(i));}return str.toString();}}

http://www.ppmy.cn/news/1127866.html

相关文章

在比特币上使用可检索性证明支付存储费用

我们为用户开发了一种为云存储付费的新方法。 与亚马逊的 S3 等传统云存储相比&#xff0c;用户不必信任服务器。 我们使用比特币智能合约来确保支付取决于服务器的可检索性证明 (PoR)&#xff0c;该证明只能在数据仍然可用且需要时可以检索的情况下生成。 可检索性证明 (PoR)…

Chrome获取RequestId

Chrome获取RequestId 参考&#xff1a;https://help.aliyun.com/zh/redis/how-do-i-obtain-the-id-of-a-request 在浏览器页面按下F12键&#xff0c;打开开发者工具页面&#xff1b; 在开发者工具页面&#xff0c;单击Network(网络)&#xff1b; 在playload(载荷)窗口中找到目…

flask-limiter报错:ConfigurationError: redis prerequisite not available

使用flask_limiter&#xff0c; app启动时有个告警&#xff1a; flask_limiter/extension.py:336: UserWarning: Using the in-memory storage for tracking rate limits as no storage was explicitly specified. This is not recommended for production use. See: https://f…

如何快速轻松自动添加微信好友?

有些客需要换新的微信号&#xff0c;想把以前微信号上的好友全部加回来&#xff0c;但是因为微信系统的规定&#xff0c;频繁加好友容易被封号&#xff0c;而且手动添加好友太费时费力&#xff0c;还要控制加好友的间隔时间。那么有没有什么方法可以快速轻松自动添加好友呢&…

uni-app 之 获取input输入内容

uni-app 之 获取input输入内容 定义名称 v-model"logon_phone" 获取内容 console.log("111 111 logon_phone 打印 ", this.logon_phone) <template><view style"width: 100%; display: flex; flex-direction:column; align-items:center;&q…

100万级连接,石墨文档WebSocket网关如何架构?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近&#xff0c;尼恩指导一个小伙伴简历&#xff0c;写了一个《高并发网关项目》&#xff0c;此项目帮这个小伙拿到 字节/阿里/…

信息化发展58

安全系统 X 轴是“ 安全机制” 。安全机制可以理解为提供某些安全服务&#xff0c; 利用各种安全技术和技巧&#xff0c; 所形成的一个较为完善的结构体系。如“ 平台安全” 机制&#xff0c; 实际上就是指安全操作系统、安全数据库、应用开发运营的安全平台以及网络安全管理监…

MyBatis-Plus多数据源——如何在一个项目中使用多个MySQL数据库

前言 MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window) 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 本系列博客结合实际应用场景&#xff0c;阐述MyBatis-Plus实际…