Только что провел телефонное интервью с TripAdvisor (и не сделал разрез).
Мне дали код ниже и попросили реализовать findBestTravelAlert
(на Java).
Учитывая список объектов TravelAlert, найдите лучшее оповещение о путешествии для определенного места. Смотрите пример на http://www.tripadvisor.com/Tourism-g147306-Haiti-Vacations.html
class TravelAlert {
int id;
String message;
int locationId;
}
class Location {
int locationId;
int parentLocationId; // -1 if no parent, location is hierarchy
String name;
static Location findLocation(int locationId) {...}
}
class TravelAlertStore {
private List<TravelAlert> lAlerts; // already populated, static
// Return null if no alert
TravelAlert findBestTravelAlert(int locationId) {
// implement this
}
}
Примеры : Если у нас есть 3 предупреждения о поездках, одно в Бостоне, одно в Массачусетсе и одно в США:
- Пользователь, просматривающий конкретную страницу в Бостоне, должен видеть предупреждение о путешествии в Бостоне, а не в Массачусетсе
- Пользователь, просматривающий страницу Массачусетса, должен увидеть предупреждение о путешествии
Массачусетс
- Пользователь, просматривающий конкретную страницу Ньютона, должен увидеть
туристическая тревога Массачусетса
- Пользователь, просматривающий определенную страницу Нью-Йорка
должен увидеть предупреждение о поездке в США
- Пользователь, смотрящий на Монреаль
на странице не должно быть предупреждений о путешествиях.
То, как я это сделал, было довольно наивно, но это было все, что я мог придумать под давлением:
Просмотрите список TravelAlerts
и посмотрите, совпадает ли locationId
с нашим locationId
. Если нет, повторите поиск и проверьте совпадения с locationId
родительского слова. Если в какой-то момент в этом процессе мы найдем совпадение, вернем это TravelAlert
. Если мы дойдем до конца процесса (т. Е. Нет родительского местоположения), вернем null
.
Вот код:
TravelAlert findBestTravelAlert(int locationId) {
TravelAlert current_alert = searchList(locationId, lAlerts);
if(current_alert != null) {
return current_alert;
}
else {
int parentLocationId = findLocation(locationId).parentLocationId;
if(parent_locId == -1)
return null;
else {
return findBestTravelAlert(parentLocationId);
}
}
}
TravelAlert searchList(int locationId, List<TravelAlert> cur_list) {
if(cur_list == null) {
return null;
}
else if(cur_list.locationId == locationId) {
return cur_list;
}
else {
searchList(locationId, cur_list.next())
}
}
Сложность времени составляет O (nk) , где n - длина списка TravelAlerts, а k - высота дерева иерархии местоположений. .
Итак, мой вопрос:
- Есть ли лучший алгоритм для этого, и
- Есть ли лучший способ реализации моего алгоритма?
Я уверен, что ответ на второй вопрос - да; Должны быть встроенные методы, которые я мог бы использовать, если бы я был более знаком с Java.
Любая помощь будет оценена. Удачи всем будущим претендентам!