Welcome to Subscribe On Youtube
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 then
tables.void insertRow(String name, String[] row)
Adds a row to the tablename
. It is guaranteed that the table will exist, and the size of the arrayrow
is equal to the number of columns in the table.void deleteRow(String name, int rowId)
Removes the rowrowId
from the tablename
. 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 rowrowId
and the columncolumnId
from the tablename
.
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]
, andname
consist of lowercase English letters.1 <= columns[i] <= 100
- All the strings of
names
are distinct. name
exists in the arraynames
.row.length
equals the number of columns in the chosen table.rowId
andcolumnId
will be valid.- At most
250
calls will be made toinsertRow
anddeleteRow
. - At most
104
calls will be made toselectCell
.
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 { 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); */
-
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)
-
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); */