leetcode
leetcode 2251 ~ 2300
设计一个待办事项清单

设计一个待办事项清单

难度:

标签:

题目描述

代码结果

运行时间: 59 ms, 内存: 18.4 MB


/**
 * Leetcode 2590: 设计一个待办事项清单
 *
 * 题目思路:
 * 1. 设计一个Todo类来表示一个待办事项,包含id、标题和完成状态。
 * 2. 实现一个TodoList类,包含添加、删除、标记完成和获取所有待办事项的方法。
 * 3. 使用ArrayList来存储Todo对象,并使用Java Stream API来实现这些方法。
 */

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

class Todo {
    private int id;
    private String title;
    private boolean completed;

    public Todo(int id, String title) {
        this.id = id;
        this.title = title;
        this.completed = false;
    }

    public int getId() {
        return id;
    }

    public String getTitle() {
        return title;
    }

    public boolean isCompleted() {
        return completed;
    }

    public void markCompleted() {
        this.completed = true;
    }
}

class TodoList {
    private List<Todo> todos;

    public TodoList() {
        this.todos = new ArrayList<>();
    }

    public void addTodo(int id, String title) {
        todos.add(new Todo(id, title));
    }

    public void deleteTodoById(int id) {
        todos = todos.stream()
                      .filter(todo -> todo.getId() != id)
                      .collect(Collectors.toList());
    }

    public void markTodoCompleted(int id) {
        todos.stream()
             .filter(todo -> todo.getId() == id)
             .findFirst()
             .ifPresent(Todo::markCompleted);
    }

    public List<Todo> getTodos() {
        return todos.stream()
                     .collect(Collectors.toList());
    }
}

解释

方法:

该题解实现了一个待办事项清单,允许多个用户添加、查询和完成任务。每个任务包含描述、截止日期、标签和完成状态。主要功能包括添加任务、获取所有未完成任务、按标签获取未完成任务和完成指定任务。实现思路如下: 1. 使用字典存储每个用户的任务列表和任务计数。 2. 添加任务时,生成唯一的任务ID并存储任务详细信息。任务按截止日期排序。 3. 查询功能允许按用户ID获取未完成任务列表,或按特定标签筛选。 4. 完成任务功能通过标记任务为已完成来更新任务状态。

时间复杂度:

O(n log n) for addTask, O(k) for getAllTasks, getTasksForTag, and completeTask

空间复杂度:

O(m)

代码细节讲解

🦆
如何处理如果用户ID不存在于系统中,而调用添加任务的情况?
在实现中,如果用户ID不存在于系统中,系统会自动为该用户ID创建一个新的任务列表和任务计数。在`addTask`方法中,首先检查`userId`是否已存在于`tasks`字典中。如果不存在,就会为该用户初始化一个空的任务列表和任务计数设为0。因此,该方法可以无缝处理新用户的任务添加,不需要额外的错误处理或拒绝操作。
🦆
在每次添加任务后重新排序任务列表是否会影响性能?考虑到任务数量可能非常大。
每次在添加任务后对任务列表进行排序确实会影响性能,尤其是当任务数量非常大时。在当前的实现中,使用的排序方法是`O(n log n)`的时间复杂度,这在任务列表较长时可能会成为性能瓶颈。为了提高效率,可以考虑使用优先队列(例如堆结构)来维护任务的有序状态。通过堆,插入新任务的时间复杂度可以降低到`O(log n)`,从而在处理大量任务时保持较高的效率。
🦆
完成任务的方法中,如果指定的任务ID不存在于用户的任务列表中,该如何处理?
在当前的`completeTask`方法实现中,如果指定的任务ID不存在于用户的任务列表中,则该方法不会执行任何操作,也不会提供任何错误反馈。为了改进用户体验和系统的健壮性,可以修改方法来返回一个状态指示,例如返回一个布尔值表示任务完成是否成功,或者抛出一个异常来通知调用者任务ID无效。这样可以使得调用者能够更明确地了解操作的结果并据此做出相应的响应。

相关问题