2014-01-05 2 views
0

Недавно я столкнулся с этим вопросом в интервью и сделал очень плохо.Печать уровня соединений друзей по уровню

Setup: 
Assume primitive Facebook. FB has Members. 

class Member { 
String name; 
String email; 
List<Member> friends; 
} 

Вопрос: Код printSocialGraph (член м). Прямыми друзьями m являются друзья Уровня 1. Друзья друзей - друзья второго уровня ..... и т. Д. Уровень печати 1 друга. Тогда уровень печати 2 друзей .... и так далее

void printSocialGraph (Member m){ 
//Your code here 
} 

Я пытался сохранить очереди для хранения своих друзей на каждом уровне, но я не получил его очень далеко. Любая идея, как мы могли бы решить ее при всех условиях проверки ошибок?

+2

http://en.wikipedia.org/wiki/Breadth-first_search – SLaks

+0

Любые полные реализации, которые будут изучать будущие интервью? – noobcoder

+3

@noobcoder У вас очень хорошее имя пользователя. Не идите на работу! ;) –

ответ

5

Просто добавьте новых детей в конце очереди поиска, пока их больше нет. Так как граф может содержать циклы, вы также должны сломать их с помощью «посещенного» набора.

void printSocialGraph (Member m) { 
    Queue<Member> queue = new LinkedList<>(); 
    Set<Member> visited = new HashSet<>(); 
    queue.add(m); 
    while (!queue.isEmpty()) { 
    Member member = queue.getFirst(); 
    if (!visited.contains(member)) { 
     visited.add(member); 
     System.out.println(member.name + ' ' + member.email); 
     if (member.friends != null) { 
     queue.addAll(member.friends); 
     } 
    } 
    } 
} 

Если вам также нужно распечатать, какой уровень член включен, то самый простой, вероятно, использовать две очереди: одна для текущего уровня, а другой для следующего, обменивая очереди между ними.

+1

Несмотря на то, что я с нетерпением жду расширенного решения, которое также печатает уровни, я думаю, вы должны выбрать это как правильный ответ на вопрос интервью. Учитывая, что в фактическом производстве вы хотели бы ограничить количество итераций или уровней, я хотел бы предложить собственное решение в качестве альтернативы, но я не могу, потому что такой интересный вопрос был сбит триггером счастливых модераторов. – RHT

Смежные вопросы