返回介绍

solution / 2400-2499 / 2408.Design SQL / README_EN

发布于 2024-06-17 01:03:06 字数 7789 浏览 0 评论 0 收藏 0

2408. Design SQL

中文文档

Description

You are given n tables represented with two arrays names and columns, where names[i] is the name of the ith table and columns[i] is the number of columns of the ith table.

You should be able to perform the following operations:

  • Insert a row in a specific table. Each row you insert has an id. The id is assigned using an auto-increment method where the id of the first inserted row is 1, and the id of each other row inserted into the same table is the id of the last inserted row (even if it was deleted) plus one.
  • Delete a row from a specific table. Note that deleting a row does not affect the id of the next inserted row.
  • Select a specific cell from any table and return its value.

Implement the SQL class:

  • SQL(String[] names, int[] columns) Creates the n tables.
  • void insertRow(String name, String[] row) Adds a row to the table name. It is guaranteed that the table will exist, and the size of the array row is equal to the number of columns in the table.
  • void deleteRow(String name, int rowId) Removes the row rowId from the table name. It is guaranteed that the table and row will exist.
  • String selectCell(String name, int rowId, int columnId) Returns the value of the cell in the row rowId and the column columnId from the table name.

 

Example 1:

Input
["SQL", "insertRow", "selectCell", "insertRow", "deleteRow", "selectCell"]
[[["one", "two", "three"], [2, 3, 1]], ["two", ["first", "second", "third"]], ["two", 1, 3], ["two", ["fourth", "fifth", "sixth"]], ["two", 1], ["two", 2, 2]]
Output
[null, null, "third", null, null, "fifth"]

Explanation
SQL sql = new SQL(["one", "two", "three"], [2, 3, 1]); // creates three tables.
sql.insertRow("two", ["first", "second", "third"]); // adds a row to the table "two". Its id is 1.
sql.selectCell("two", 1, 3); // return "third", finds the value of the third column in the row with id 1 of the table "two".
sql.insertRow("two", ["fourth", "fifth", "sixth"]); // adds another row to the table "two". Its id is 2.
sql.deleteRow("two", 1); // deletes the first row of the table "two". Note that the second row will still have the id 2.
sql.selectCell("two", 2, 2); // return "fifth", finds the value of the second column in the row with id 2 of the table "two".

 

Constraints:

  • n == names.length == columns.length
  • 1 <= n <= 104
  • 1 <= names[i].length, row[i].length, name.length <= 20
  • names[i], row[i], and name consist of lowercase English letters.
  • 1 <= columns[i] <= 100
  • All the strings of names are distinct.
  • name exists in the array names.
  • row.length equals the number of columns in the chosen table.
  • rowId and columnId will be valid.
  • At most 250 calls will be made to insertRow and deleteRow.
  • At most 104 calls will be made to selectCell.

Solutions

Solution 1: Hash Table

Create a hash table tables to store the mapping of table names to table data rows. Directly simulate the operations in the problem.

The time complexity of each operation is $O(1)$, and the space complexity is $O(n)$.

class SQL:
  def __init__(self, names: List[str], columns: List[int]):
    self.tables = defaultdict(list)

  def insertRow(self, name: str, row: List[str]) -> None:
    self.tables[name].append(row)

  def deleteRow(self, name: str, rowId: int) -> None:
    pass

  def selectCell(self, name: str, rowId: int, columnId: int) -> str:
    return self.tables[name][rowId - 1][columnId - 1]


# Your SQL object will be instantiated and called as such:
# obj = SQL(names, columns)
# obj.insertRow(name,row)
# obj.deleteRow(name,rowId)
# param_3 = obj.selectCell(name,rowId,columnId)
class SQL {
  private Map<String, List<List<String>>> tables;

  public SQL(List<String> names, List<Integer> columns) {
    tables = new HashMap<>(names.size());
  }

  public void insertRow(String name, List<String> row) {
    tables.computeIfAbsent(name, k -> new ArrayList<>()).add(row);
  }

  public void deleteRow(String name, int rowId) {
  }

  public String selectCell(String name, int rowId, int columnId) {
    return tables.get(name).get(rowId - 1).get(columnId - 1);
  }
}

/**
 * Your SQL object will be instantiated and called as such:
 * SQL obj = new SQL(names, columns);
 * obj.insertRow(name,row);
 * obj.deleteRow(name,rowId);
 * String param_3 = obj.selectCell(name,rowId,columnId);
 */
class SQL {
public:
  unordered_map<string, vector<vector<string>>> tables;
  SQL(vector<string>& names, vector<int>& columns) {
  }

  void insertRow(string name, vector<string> row) {
    tables[name].push_back(row);
  }

  void deleteRow(string name, int rowId) {
  }

  string selectCell(string name, int rowId, int columnId) {
    return tables[name][rowId - 1][columnId - 1];
  }
};

/**
 * Your SQL object will be instantiated and called as such:
 * SQL* obj = new SQL(names, columns);
 * obj->insertRow(name,row);
 * obj->deleteRow(name,rowId);
 * string param_3 = obj->selectCell(name,rowId,columnId);
 */
type SQL struct {
  tables map[string][][]string
}

func Constructor(names []string, columns []int) SQL {
  return SQL{map[string][][]string{}}
}

func (this *SQL) InsertRow(name string, row []string) {
  this.tables[name] = append(this.tables[name], row)
}

func (this *SQL) DeleteRow(name string, rowId int) {

}

func (this *SQL) SelectCell(name string, rowId int, columnId int) string {
  return this.tables[name][rowId-1][columnId-1]
}

/**
 * Your SQL object will be instantiated and called as such:
 * obj := Constructor(names, columns);
 * obj.InsertRow(name,row);
 * obj.DeleteRow(name,rowId);
 * param_3 := obj.SelectCell(name,rowId,columnId);
 */

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文