社交网络中的共同好友计算(一度好友与二度好友)

项目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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值