7月算法训练------第十三天(双向链表)解题报告
题目类型:双向链表
题目难度:困难
第一题、2296. 设计一个文本编辑器
- 题目链接:2296. 设计一个文本编辑器
- 思路分析:
- 主要考察双向链表的操作,链表上每个节点上存储的数据类型是char。
- 执行
addText(String text)
时,将text
分为n
个字符,相当于执行n
次insert()
方法。 - 执行
deleteText(int k)
时,循环k
次,调用remove()
函数。
第一次见java
中的动态类型var
,之前一直以为只有javascript
中有这个。
- 代码:
class TextEditor {
Node root, cur;
public TextEditor() {
root = cur = new Node();
root.prev = root;
root.next = root;
}
public void addText(String text) {
for (var i = 0; i < text.length(); i++)
cur = cur.insert(new Node(text.charAt(i)));
}
public int deleteText(int k) {
var k0 = k;
for (; k > 0 && cur != root; --k) {
cur = cur.prev;
cur.next.remove();
}
return k0 - k;
}
String text() {
var s = new StringBuilder();
var cur = this.cur;
for (var k = 10; k > 0 && cur != root; --k) {
s.append(cur.ch);
cur = cur.prev;
}
return s.reverse().toString();
}
public String cursorLeft(int k) {
for (; k > 0 && cur != root; --k)
cur = cur.prev;
return text();
}
public String cursorRight(int k) {
for (; k > 0 && cur.next != root; --k)
cur = cur.next;
return text();
}
}
// 双向链表
class Node {
Node prev, next;
char ch;
Node() {}
Node(char ch) {
this.ch = ch;
}
Node insert(Node node) {
node.prev = this;
node.next = this.next;
node.prev.next = node;
node.next.prev = node;
return node;
}
void remove() {
this.prev.next = this.next;
this.next.prev = this.prev;
}
}
/**
* Your TextEditor object will be instantiated and called as such:
* TextEditor obj = new TextEditor();
* obj.addText(text);
* int param_2 = obj.deleteText(k);
* String param_3 = obj.cursorLeft(k);
* String param_4 = obj.cursorRight(k);
*/