Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашел его полезным, Пожалуйста, как Этот пост и/или УПОТАТЬ Мое решение пост на форумах LeetCode Отказ
Проблема летета # 1396 (средний): дизайн подземной системы
Описание:
( Перейти к : Идея решения Код : JavaScript | Python |. Java |. C ++
Реализуйте подземный класс:
Void Checkin (INT ID, String StationName, INT T)
- Клиент с идентификатором карты, равный
ID
, попадает на станциюstationname
Во времят
. - Клиент может быть проверен только в одном месте.
- Клиент с идентификатором карты, равный
Оформить заказ (INT ID, String StationName, INT T)
- Клиент с идентификатором карты, равный
ID
, выходит с станцииstationname
Во времят
.
- Клиент с идентификатором карты, равный
Double GetaverageTime (String Startstation, String Endstation)
- Возвращает среднее время для поездки между
StartStation
иОкончание
Отказ - Среднее время вычисляется из всех предыдущих путешествий от
StartStation
кОкончание
Это произошло напрямую. - Призыв к
getaverageTime
всегда действителен.
- Возвращает среднее время для поездки между
Вы можете взять на себя все звонки на регистрироваться
и Оформить заказ
Методы последовательны. Если клиент входит во время T1
На какой-то станции они выходят в то время T2
с T2> T1
Отказ Все события происходят в хронологическом порядке.
Примеры:
Вход: | пример |
Вход | [«Подземнаясистема», «Проверка», «Проверка», «Проверка», «Оформить заказ», «Оформить заказ», «Оформить заказ», «Гетаверагетим», «Гетаверагетим», «Проверка», «Гетаверагетим», «Оформить заказ», « Гетаверагетим “] [[], [45, “Лейтон”, 3], [32, “Рай”, 8], [27, “Лейтон”, 10], [45, “Ватерлоо”, 15], [27, “Waterloo” , 20], [32, «Кембридж», 22], [«Рай», «Кембридж»], [«Лейтон», «Ватерлоо»], [10, «Лейтон», 24], [«Лейтон», « Waterloo “], [10,” Waterloo “, 38], [” Лейтон “,” Ватерлоо “]]] |
Вывод | [NULL, NULL, NULL, NULL, NULL, NULL, NULL, 14.00000, 11.00000, NULL, 11.00000, NULL, 12.00000] |
Объяснение | Подземноесистема подземнойсистемы (); Подземноесистема.Чукин (45, «Лейтон», 3); Подземноесистема.Чукин (32, «Рай», 8); подземноесистема.Чукин (27, «Лейтон», 10); Подземнаясистема. Проверка (45, «Ватерлоо», 15); Подземная система. Проверка (27, «Ватерлоо», 20); Подземноесистема. Проверьте (32, “Кембридж”, 22); Подземнаясистема. GetaverageTime («Рай», «Кембридж»); // вернуть 14,00000. Был только один путешествие из «Рая» (во время 8) в «Кембридж» (в раз 22) подземной системы. Среднее время («Лейтон», «Ватерлоо»); // Вернуться 11.00000. Было два путешествия от «Лейтона» в «Ватерлоо», клиент с до него и клиента с до него. Таким образом, среднее время ((15-3) + (20-10) ) /.00000 Подземноесистема.Чукин (10, “Лейтон”, 24); Подземноесистема. GetaverageTime («Лейтон», «Ватерлоо»); // Возврат 11.00000 подземныхssystem.Checkout (10, «Ватерлоо», 38); Подземноесистема. GetaverageTime («Лейтон», «Ватерлоо»); // вернуть 12.00000. |
Вход | [«Подземная зона», «Проверка», «Оформить заказ», «Гетаверагетим», «Регион», «Оформить заказ», «Гетаверагетим», «Проверка», «Оформить заказ», «Гетаверагетим»] [[], [10, «Лейтон», 3], [10, «Рай», 8], [«Лейтон», «Рай»], [5, «Лейтон», 10], [5, «Рай», 16], [«Лейтон», «Рай»], [2, «Лейтон», 21], [2, «Рай», 30], [«Лейтон», «Рай»]]] |
Вывод | [NULL, NULL, NULL, 5,00000, NULL, NULL, 5.50000, NULL, NULL, 6.66667] |
Объяснение | Подземноесистема подземнойсистемы (); Подземноесистема. Чекин (10, “Лейтон”, 3); Подземноесистема. Проверка (10, «рай», 8); Подземноесистема. GetaverageTime («Лейтон», «Рай»); // вернуть 5,00000 подземныхssystem.checkin (5, “Лейтон”, 10); Подземнаясистема. Проверка (5, «рай», 16); Подземноесистема. GetaverageTime («Лейтон», «Рай»); // Возврат 5.50000 подземной ashsystem.checkin (2, “Лейтон”, 21); Подземноесистема. Проверка (2, «рай», 30); Подземноесистема. GetaverageTime («Лейтон», «Рай»); // return 6.66667. |
Ограничения:
- Там будет больше
20000
Операции. 1, T ^ 6.
- Все строки состоят из прописных и строчных английских букв и цифр.
1 длиной
- Ответы в … 10 ^ -5
фактической стоимости будет принят как правильно.
Идея:
( Перейти к : Описание проблемы Код : JavaScript | Python |. Java |. C ++
Первое, что мы должны понимать, что поскольку проверки и оформления заказа отделены, нам понадобится какой-то тип структуры данных, в которой хранить информацию о контрольной информации, пока мы не найдем соответствующую информацию о проверке.
Следующая важная реализация заключается в том, что с тех пор, как мы только в конечном итоге заботитесь о времени маршрута, нам действительно не нужно хранить информацию о проверке. Пока мы храним информацию Checkin, пока не доберемся до информационной информации о проверке, мы действительно можем просто сохранить информацию о поездке отдельно по маршруту и избавиться от информации о проверке и оформлении заказа. Это поможет сохранить пространство, необходимое для минимума.
Как мы захотите посмотреть флаги и информацию о маршруте по имени ID и маршрута, мы должны использовать Карта Структуры для обоих ( Checkins & маршруты ). Для информации о маршруте нам нужно только отслеживать количество поездок и общей длительности, чтобы мы могли рассчитать среднее значение по мере необходимости. Мы также можем использовать объединенное имя для ключа на карте маршрута, чтобы хранить поездку в целом, а не для того, чтобы отслеживать оба конца отдельно.
Выполнение:
Для лучшей эффективности JavaScript можно использовать UINT32Array для маршрута, Python может использовать кортеж для проверки, а Java и C ++ могут использовать пары для регистрации и Java, которые могут использовать пары вместо того, чтобы объединить названия станций.
Код JavaScript:
( Перейти к : Описание проблемы Идея решения
class UndergroundSystem { constructor() { this.checkins = new Map() this.routes = new Map() } checkIn(id, stationName, t) { this.checkins.set(id, [stationName, t]) }; checkOut(id, stationName, t) { let [stn, start] = this.checkins.get(id), route = stn + "," + stationName this.checkins.delete(id) if (!this.routes.has(route)) this.routes.set(route, new Uint32Array(2)) let trip = this.routes.get(route) trip[0]++, trip[1] += t - start }; getAverageTime(startStation, endStation) { let [count, sum] = this.routes.get(startStation + "," + endStation) return sum / count }; };
Код Python:
( Перейти к : Описание проблемы Идея решения
class UndergroundSystem: def __init__(self): self.checkins = defaultdict() self.routes = defaultdict() def checkIn(self, id: int, stationName: str, t: int) -> None: self.checkins[id] = (stationName, t) def checkOut(self, id: int, stationName: str, t: int) -> None: stn, start = self.checkins[id] del self.checkins[id] route = stn + "," + stationName if route not in self.routes: self.routes[route] = [0,0] trip = self.routes[route] trip[0] += 1 trip[1] += t - start def getAverageTime(self, startStation: str, endStation: str) -> float: count, rsum = self.routes[startStation + "," + endStation] return rsum / count
Java код:
( Перейти к : Описание проблемы Идея решения
class UndergroundSystem { Map> checkins = new HashMap<>(); Map , int[]> routes = new HashMap<>(); public void checkIn(int id, String stationName, int t) { checkins.put(id, new Pair(stationName, t)); } public void checkOut(int id, String stationName, int t) { Pair cIn = checkins.get(id); checkins.remove(id); Pair route = new Pair(cIn.getKey(), stationName); int[] trip = routes.getOrDefault(route, new int[2]); trip[0]++; trip[1] += t - cIn.getValue(); routes.put(route, trip); } public double getAverageTime(String startStation, String endStation) { int[] trip = routes.get(new Pair(startStation, endStation)); return (double)trip[1] / trip[0]; } }
C ++ код:
( Перейти к : Описание проблемы Идея решения
class UndergroundSystem { public: unordered_map> checkins; unordered_map > routes; void checkIn(int id, string stationName, int t) { checkins[id] = {stationName, t}; } void checkOut(int id, string stationName, int t) { auto [stn, start] = checkins[id]; checkins.erase(id); string route = stn + "," + stationName; routes[route].first++, routes[route].second += t - start; } double getAverageTime(string startStation, string endStation) { auto& [count, sum] = routes[startStation + "," + endStation]; return (double)sum / count; } };
Оригинал: “https://dev.to/seanpgallivan/solution-design-underground-system-5e2i”