项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步
社交网络中经常存在求共同好友的需求,比如最常见的求一度好友与二度好友,如上图所示。
package bit.edu.cn;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Friend {
/*
* 思路:如果A与某人有共同好友,则该人必出现在二度好友中
* 不在二度好友中的,则与A的共同好友数必然为0
* 故只需遍历所有的二度好友即可,但是不要将那些无共同好友的一度好友忘记!也就是初始化firstout
*/
public static void test() {
String directsString = "BDEH";
String bString = "CD";
String dString = "BEGF";
String eString = "CD";
String hString = "I";
List<String> directs = stringToList(directsString);
Map<String,List<String>> indirects = new HashMap<String,List<String>>();
indirects.put("B",stringToList(bString));
indirects.put("D",stringToList(dString));
indirects.put("E",stringToList(eString));
indirects.put("H",stringToList(hString));
//一度好友与二度好友
Map<String,Integer> firstout = new HashMap<String,Integer>();
Map<String,Integer> secondout = new HashMap<String,Integer>();
for(String str:directs) {
firstout.put(str,0); //一度好友
}
for(Map.Entry<String, List<String>> entry:indirects.entrySet()) {
for(String id2:entry.getValue()) {
//得到的为[c,d]这种结构
Integer value = firstout.get(id2);
if (value != null) {
firstout.put(id2,value + 1);
} else {
if(secondout.get(id2) == null) {
secondout.put(id2,1);
}else {
secondout.put(id2,secondout.get(id2) + 1);
}
}
}
}
System.out.println("A与一度好友B的共同好友数为:" + firstout.get("B"));
System.out.println("A与一度好友D的共同好友数为:" + firstout.get("D"));
System.out.println("A与二度好友C的共同好友数为:" + secondout.get("C"));
System.out.println("A与二度好友I的共同好友数为:" + secondout.get("I"));
}
public static List<String> stringToList(String str) {
List<String> list = new ArrayList<String>();
for(int i=0; i<str.length(); i++) {
list.add(str.charAt(i) + "");
}
return list;
}
public static void main(String[] args) {
test();
}
}
运行结果:
A与一度好友B的共同好友数为:1
A与一度好友D的共同好友数为:2
A与二度好友C的共同好友数为:2
A与二度好友I的共同好友数为:1