7月算法训练------第十三天(双向链表)解题报告

本文详细解析了一道涉及双向链表的编程题目,通过实例讲解如何设计和实现一个文本编辑器,包括addText、deleteText、cursorLeft和cursorRight方法的代码实现。重点讨论了动态类型的使用以及链表节点的插入和删除操作。
摘要由CSDN通过智能技术生成

7月算法训练------第十三天(双向链表)解题报告

题目类型:双向链表
题目难度:困难

第一题、2296. 设计一个文本编辑器

  1. 题目链接:2296. 设计一个文本编辑器
  2. 思路分析:
  • 主要考察双向链表的操作,链表上每个节点上存储的数据类型是char。
  • 执行addText(String text)时,将text分为n个字符,相当于执行ninsert()方法。
  • 执行deleteText(int k)时,循环k次,调用remove()函数。
    第一次见java中的动态类型var,之前一直以为只有javascript中有这个。
  1. 代码:
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);
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值