Сложность: medium
Вам дается несколько журналов, где каждый журнал содержит уникальный идентификатор и временную метку. Временная метка - это строка, имеющая следующий формат: Год:Месяц:День:Час:Минута:Секунда, например, 2017:01:01:23:59:59. Все домены - десятичные числа с нулевым добавлением. Реализация класса LogSystem: LogSystem() Инициализирует объект LogSystem. void put(int id, string timestamp) Сохраняет заданный журнал (id, timestamp) в вашей системе хранения.
int[] retrieve(string start, string end, string granularity) Возвращает идентификаторы журналов, временные метки которых находятся в диапазоне от start до end включительно. start и end имеют тот же формат, что и timestamp, а granularity означает, насколько точным должен быть диапазон (т. е. с точностью до дня, минуты и т. д.). Например, start = "2017:01:01:23:59:59", end = "2017:01:02:23:59:59", а granularity = "Day" означает, что нам нужно найти журналы в диапазоне от 1 января 2017 года до 2 января 2017 года включительно, а час, минуту и секунду для каждой записи журнала можно игнорировать.
Пример:
Input
["LogSystem", "put", "put", "put", "retrieve", "retrieve"]
[[], [1, "2017:01:01:23:59:59"], [2, "2017:01:01:22:59:59"], [3, "2016:01:01:00:00:00"], ["2016:01:01:01:01:01", "2017:01:01:23:00:00", "Year"], ["2016:01:01:01:01:01", "2017:01:01:23:00:00", "Hour"]]
Output
[null, null, null, null, [3, 2, 1], [2, 1]]
👨💻 Алгоритм:
1⃣Инициализация и хранение журналов
Реализуйте метод put, который будет сохранять журнал с заданным id и timestamp в системе хранения.
2⃣Формирование диапазона
Реализуйте метод retrieve, который будет формировать диапазон временных меток на основе заданного start, end и granularity.
3⃣Фильтрация и возврат результатов
Используйте сформированный диапазон для фильтрации журналов и возврата идентификаторов тех журналов, чьи временные метки попадают в этот диапазон.
😎 Решение:
using System;
using System.Collections.Generic;
public class LogSystem {
private List<LogEntry> logs;
public LogSystem() {
logs = new List<LogEntry>();
}
public void Put(int id, string timestamp) {
logs.Add(new LogEntry(id, timestamp));
}
public IList<int> Retrieve(string start, string end, string granularity) {
int index = GetGranularityIndex(granularity);
string startPrefix = start.Substring(0, index);
string endPrefix = end.Substring(0, index);
List<int> result = new List<int>();
foreach (var log in logs) {
string timestampPrefix = log.Timestamp.Substring(0, index);
if (startPrefix.CompareTo(timestampPrefix) <= 0 && timestampPrefix.CompareTo(endPrefix) <= 0) {
result.Add(log.Id);
}
}
return result;
}
private int GetGranularityIndex(string granularity) {
switch (granularity) {
case "Year": return 4;
case "Month": return 7;
case "Day": return 10;
case "Hour": return 13;
case "Minute": return 16;
case "Second": return 19;
default: return 19;
}
}
private class LogEntry {
public int Id { get; }
public string Timestamp { get; }
public LogEntry(int id, string timestamp) {
Id = id;
Timestamp = timestamp;
}
}
}
Ставь 👍 и забирай 📚 Базу знаний