Рубрики
Без рубрики

Решение: дизайн подземной системы

Это является частью серии пояснений решения LeetCode (индекс). Если вам понравилось это решение или Фу … помечены алгоритмами, JavaScript, Java, Python.

Это является частью серии объяснений решения 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”