[JavaScript 刷题] 其他 - 设计一个文本编辑器,leetcode 2296

Posted GoldenaArcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaScript 刷题] 其他 - 设计一个文本编辑器,leetcode 2296相关的知识,希望对你有一定的参考价值。

[javascript 刷题] 其他 - 设计一个文本编辑器,leetcode 2296

github repo 地址: https://github.com/GoldenaArcher/js_leetcode,Github 的目录 大概 会更新的更勤快一些。

题目地址:2296. Design a Text Editor

题目

如下:

Design a text editor with a cursor that can do the following:

  • Add text to where the cursor is.
  • Delete text from where the cursor is (simulating the backspace key).
  • Move the cursor either left or right.

When deleting text, only characters to the left of the cursor will be deleted. The cursor will also remain within the actual text and cannot be moved beyond it. More formally, we have that 0 <= cursor.position <= currentText.length always holds.

Implement the TextEditor class:

  • TextEditor() Initializes the object with empty text.
  • void addText(string text) Appends text to where the cursor is. The cursor ends to the right of text.
  • int deleteText(int k) Deletes k characters to the left of the cursor. Returns the number of characters actually deleted.
  • string cursorLeft(int k) Moves the cursor to the left k times. Returns the last min(10, len) characters to the left of the cursor, where len is the number of characters to the left of the cursor.
  • string cursorRight(int k) Moves the cursor to the right k times. Returns the last min(10, len) characters to the left of the cursor, where len is the number of characters to the left of the cursor.

解题思路

这题真的做的有点……城市套路村,我想回农村。

其实增删改的需求还是比较简单和明确的,但是写完了之后超时……主要还是因为数据结构没有把握好的关系。下面是提供的核心代码:

var TextEditor = function () ;

/**
 * @param string text
 * @return void
 */
TextEditor.prototype.addText = function (text) ;

/**
 * @param number k
 * @return number
 */
TextEditor.prototype.deleteText = function (k) ;

/**
 * @param number k
 * @return string
 */
TextEditor.prototype.cursorLeft = function (k) ;

/**
 * @param number k
 * @return string
 */
TextEditor.prototype.cursorRight = function (k) ;

/**
 * Your TextEditor object will be instantiated and called as such:
 * var obj = new TextEditor()
 * obj.addText(text)
 * var param_2 = obj.deleteText(k)
 * var param_3 = obj.cursorLeft(k)
 * var param_4 = obj.cursorRight(k)
 */

因为看到了返回值都是字符串,所以我错误的将其初始化了字符串类型,在 addText, deleteText, cursorRight, cursorLeft 中我倒是使用了数组去进行操作,不过每次结束操作还是会将数组转化为字符串。

大概就是这个转换的代价太高了,以至于写了好几次都是超过时限,在选择了数组之后就没问题了。

其他的就是四个操作函数中需要注意 cursor 的位置。如 addText,它是在 cursor 添加对应的字符串,删除同理。cursorRightcursorLeft 则是要注意 cursor 会不会小于 0 或是大于已经保存的数组长度。

注意了这几个细节问题之后,实现代码就比较简单了。

使用 JavaScript 解题

之前还看到了一种比相对而言更优一些的做法,那就是使用两个数组去保存光标左边与光标右边的值。

var TextEditor = function () 
  this.str = [];
  this.cursor = 0;
;

/**
 * @param string text
 * @return void
 */
TextEditor.prototype.addText = function (text) 
  this.str.splice(this.cursor, 0, ...text.split(""));
  this.cursor += text.length;
;

/**
 * @param number k
 * @return number
 */
TextEditor.prototype.deleteText = function (k) 
  const deleted = Math.min(k, this.cursor);
  this.cursor -= deleted;

  this.str.splice(this.cursor, deleted);

  return deleted;
;

/**
 * @param number k
 * @return string
 */
TextEditor.prototype.cursorLeft = function (k) 
  const newCursor = this.cursor - k;
  this.cursor = Math.max(newCursor, 0);

  const beginPt = Math.max(this.cursor - 10, 0);
  return this.str.slice(beginPt, this.cursor).join("");
;

/**
 * @param number k
 * @return string
 */
TextEditor.prototype.cursorRight = function (k) 
  const newCursor = this.cursor + k;
  this.cursor = Math.min(newCursor, this.str.length);

  const beginPt = Math.max(this.cursor - 10, 0);
  return this.str.slice(beginPt, this.cursor).join("");
;

/**
 * Your TextEditor object will be instantiated and called as such:
 * var obj = new TextEditor()
 * obj.addText(text)
 * var param_2 = obj.deleteText(k)
 * var param_3 = obj.cursorLeft(k)
 * var param_4 = obj.cursorRight(k)
 */

以上是关于[JavaScript 刷题] 其他 - 设计一个文本编辑器,leetcode 2296的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript 刷题] 二分搜索 - 第一个错误的版本,Leetcode 278

JavaScript-其他设计模式

[JavaScript 刷题] 栈 - 下一个更大元素 I, leetcode 496

[JavaScript 刷题] 栈 - 下一个更大元素 I, leetcode 496

[JavaScript 刷题] 栈 - 下一个更大元素 I, leetcode 496

[JavaScript 刷题] 搜索 - DFS(深度优先搜索)