Leetcode2296:设计一个文本编辑器
题目描述:
请你设计一个带光标的文本编辑器,它可以实现以下功能:
- 添加:在光标所在处添加文本。
- 删除:在光标所在处删除文本(模拟键盘的删除键)。
- 移动:将光标往左或者往右移动。
当删除文本时,只有光标左边的字符会被删除。光标会留在文本内,也就是说任意时候 0 <= cursor.position <= currentText.length
都成立。
请你实现 TextEditor
类:
TextEditor()
用空文本初始化对象。void addText(string text)
将text
添加到光标所在位置。添加完后光标在text
的右边。int deleteText(int k)
删除光标左边k
个字符。返回实际删除的字符数目。string cursorLeft(int k)
将光标向左移动k
次。返回移动后光标左边min(10, len)
个字符,其中len
是光标左边的字符数目。string cursorRight(int k)
将光标向右移动k
次。返回移动后光标左边min(10, len)
个字符,其中len
是光标左边的字符数目。
代码思路:
__init__(self)
- 初始化方法,创建了两个空字符串属性
left
和right
。 - 这两个字符串分别用于存储光标左侧和右侧的文本。
addText(self, text: str) -> None
- 功能:在光标当前位置(即
left
的末尾)添加文本。 - 参数:
text
是要添加的字符串。 - 实现:直接将
text
追加到left
字符串的末尾。 - 返回值:无。
deleteText(self, k: int) -> int
- 功能:从光标当前位置(即
left
的末尾)向前删除k
个字符。 - 参数:
k
是要删除的字符数。 - 实现:
- 首先计算
left
的长度l1
。 - 然后通过切片操作
self.left[:-k]
删除left
末尾的k
个字符。 - 返回实际删除的字符数(由于
left
的长度变化,实际删除的字符数可能小于k
,如果k
大于left
的长度)。
- 首先计算
- 返回值:实际删除的字符数。
cursorLeft(self, k: int) -> str
- 功能:将光标向左移动
k
个字符位置,并将移动过的字符从left
移动到right
。 - 参数:
k
是光标向左移动的字符数。 - 实现:
- 通过切片操作
self.left[-k:]
获取left
末尾的k
个字符,并将它们移动到right
的开头。 - 同时,更新
left
,去掉末尾的k
个字符。 - 返回
left
的末尾10个字符(如果left
长度小于10,则返回全部)。
- 通过切片操作
- 返回值:移动后
left
的末尾10个字符。
cursorRight(self, k: int) -> str
- 功能:将光标向右移动
k
个字符位置,并将移动过的字符从right
移动到left
。 - 参数:
k
是光标向右移动的字符数。 - 实现:
- 通过切片操作
self.right[:k]
获取right
开头的k
个字符,并将它们移动到left
的末尾。 - 同时,更新
right
,去掉开头的k
个字符。 - 返回
left
的末尾10个字符(如果left
长度小于10,则返回全部)。
- 通过切片操作
- 返回值:移动后
left
的末尾10个字符。
代码实现:
class TextEditor:
def __init__(self):
self.left = ""
self.right = ""
def addText(self, text: str) -> None:
self.left += text
def deleteText(self, k: int) -> int:
l1 = len(self.left)
self.left = self.left[:-k]
return l1 - len(self.left)
def cursorLeft(self, k: int) -> str:
self.right = self.left[-k:] + self.right
self.left = self.left[:-k]
return self.left[-10:]
def cursorRight(self, k: int) -> str:
self.left = self.left + self.right[:k]
self.right = self.right[k:]
return self.left[-10:]