华为机试---社交网站好友推荐
2016-07-09 21:19
302 查看
描述: 现有一个社交网站,其好友推荐策略为:用户A和用户B不是好友,当二人的共同好友数量超过好友推荐阈值m时,就向A和B分别推荐为彼此好友。
本题任务为:对设定的m值,给定一组用户及各自好友列表,对这一组用户,反复自动应用上述好友推荐策略后(假设每次推荐都被采纳),求指定用户的最终好友列表。
注:好友关系是双向的,即:如果用户A是用户B的好友,那么用户B一定也是用户A的好友。
写一个程序,在社交网络中实现:
1)初始化社交网络
2)创建用户
3)增加指定两个用户之间的好友关系
4)反复自动应用好友推荐策略后,获取某个用户的好友数量
5)反复自动应用好友推荐策略后,判断某两个用户间是否存在好友关系
说明:
1、一个用户有且只有一个名字,且不存在重名
2、自己和自己不存在好友关系
3、用户名字大小写敏感
4、用户名字字符串长度范围为[1..20]
5、用户总数小于100个
输入: 五个整数,好友推荐阈值P,创建用户数量m,增加指定两个用户之间的好友关系数量M,查询某个用户的好友数量n,查询指定两个用户是否是好友N字符串,每个数据一行,按到上面的顺序依次输入数据,共m+M+n+N行字符串
字符串,每个一行,共m+M+n+N行字符串
输出: 输出用户的好友数量,共n个,每个一行;如果用户不存在,输出-1,否则输出好友数量。样例中的用户Jack、Peter、Tom的好友数量都是2个。
输出指定两个用户是否是好友,共N个,每个一行,如果是输出0,否则输出-1。样例中的用户Jack与Peter、Peter与Tom、Jack与Tom都是好友关系,所有输出0。
样例一输入:
2 3 3 3 3
Jack
Peter
Tom
Jack Peter
Peter Tom
Jack Tom
Jack
Peter
Tom
Jack Peter
Peter Tom
Jack Tom
样例输出:
2
2
2
0
0
0
样例二输入:
2 4 5 3 3
Jack
Peter
Tom
Lisi
Jack Peter
Peter Tom
Jack Tom
Lisi Peter
Lisi Tom
Jack
Peter
Tom
Jack Peter
Peter Tom
Jack Tom
样例二输出:
3
3
3
0
0
0
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
int p = scan.nextInt();//好友推荐阈值;
int m = scan.nextInt();//用户数量
int M = scan.nextInt();//增加指定两个用户之间的好友关系数量
int n = scan.nextInt();//查询某个用户的好友数量n
int N = scan.nextInt();//查询指定两个用户是否是好友N字符串
scan.nextLine();
//用户姓名 m个
String[] user_name = new String[m];
for(int i = 0 ; i < m ; i++){
user_name[i] = scan.nextLine();
}
//用户关系 M条
Map<String , HashSet<String>> map = new HashMap<String , HashSet<String>>();
for(int i = 0 ; i < m ; i++){
HashSet<String> set = new HashSet<String>();
map.put(user_name[i], set);
}
//添加关系
for(int i = 0 ; i < M ; i++){
String[] relation = scan.nextLine().split(" ");
map.get(relation[0]).add(relation[1]);
map.get(relation[1]).add(relation[0]);
}
//如果用户A和用户B不是好友,当两人共同好友数量超过阈值P时,推荐为彼此好友
recommendedFriend(p , m , user_name ,map);
//查询某个用户的好友数量
String[] query = new String
;
for(int i = 0 ; i < n ; i++){
query[i] = scan.nextLine();
}
//打印指定用户好友数量
printNumberOfFriend(query , n , map);
//查询指定两个用户是否是好友
String[] isFriend = new String
;
for(int i = 0 ; i < N ; i++){
isFriend[i] = scan.nextLine();
}
queryIsFriend(isFriend , N , map);
}
scan.close();
}
private static void queryIsFriend(String[] isFriend , int N , Map<String , HashSet<String>> map){
String[] judge_relation = new String[2];
for(int i = 0 ; i < N ; i++){
judge_relation = isFriend[i].split(" ");
if(map.get(judge_relation[0]).contains(judge_relation[1])){
System.out.println("0");
}else{
System.out.println("-1");
}
}
}
private static void printNumberOfFriend(String[] query , int n ,Map<String , HashSet<String>> map){
for(int i = 0 ; i < n ; i++){
//如果用户存在
if(map.containsKey(query[i])){
System.out.println(map.get(query[i]).size());
}else{
System.out.println("-1");
}
}
}
private static void recommendedFriend(int p , int m , String[] user_name ,Map<String , HashSet<String>> map){
//尝试给m个用户推荐好友
//1.本身不是好友 2.好友数量达到阈值
int count = 0;//统计共同好友的个数
for(int i = 0 ; i < m - 1 ; i++){
for(int j = i + 1 ; j < m ; j++){
//彼此不是对方的好友
if(map.get(user_name[i]).contains(user_name[j])){
continue;
}else{
for(int k = 0 ; k < m ; k++){
if(map.get(user_name[i]).contains(user_name[k]) && map.get(user_name[j]).contains(user_name[k])){
count++;
}
}
//如果共同好友数量大于阈值,推荐为彼此好友
if(count >= p){
map.get(user_name[i]).add(user_name[j]);
map.get(user_name[j]).add(user_name[i]);
}
}
}
}
}
}
描述: 现有一个社交网站,其好友推荐策略为:用户A和用户B不是好友,当二人的共同好友数量超过好友推荐阈值m时,就向A和B分别推荐为彼此好友。
本题任务为:对设定的m值,给定一组用户及各自好友列表,对这一组用户,反复自动应用上述好友推荐策略后(假设每次推荐都被采纳),求指定用户的最终好友列表。
注:好友关系是双向的,即:如果用户A是用户B的好友,那么用户B一定也是用户A的好友。
写一个程序,在社交网络中实现:
1)初始化社交网络
2)创建用户
3)增加指定两个用户之间的好友关系
4)反复自动应用好友推荐策略后,获取某个用户的好友数量
5)反复自动应用好友推荐策略后,判断某两个用户间是否存在好友关系
说明:
1、一个用户有且只有一个名字,且不存在重名
2、自己和自己不存在好友关系
3、用户名字大小写敏感
4、用户名字字符串长度范围为[1..20]
5、用户总数小于100个
输入: 五个整数,好友推荐阈值P,创建用户数量m,增加指定两个用户之间的好友关系数量M,查询某个用户的好友数量n,查询指定两个用户是否是好友N字符串,每个数据一行,按到上面的顺序依次输入数据,共m+M+n+N行字符串
字符串,每个一行,共m+M+n+N行字符串
输出: 输出用户的好友数量,共n个,每个一行;如果用户不存在,输出-1,否则输出好友数量。样例中的用户Jack、Peter、Tom的好友数量都是2个。
输出指定两个用户是否是好友,共N个,每个一行,如果是输出0,否则输出-1。样例中的用户Jack与Peter、Peter与Tom、Jack与Tom都是好友关系,所有输出0。
样例一输入:
2 3 3 3 3
Jack
Peter
Tom
Jack Peter
Peter Tom
Jack Tom
Jack
Peter
Tom
Jack Peter
Peter Tom
Jack Tom
样例输出:
2
2
2
0
0
0
样例二输入:
2 4 5 3 3
Jack
Peter
Tom
Lisi
Jack Peter
Peter Tom
Jack Tom
Lisi Peter
Lisi Tom
Jack
Peter
Tom
Jack Peter
Peter Tom
Jack Tom
样例二输出:
3
3
3
0
0
0
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
int p = scan.nextInt();//好友推荐阈值;
int m = scan.nextInt();//用户数量
int M = scan.nextInt();//增加指定两个用户之间的好友关系数量
int n = scan.nextInt();//查询某个用户的好友数量n
int N = scan.nextInt();//查询指定两个用户是否是好友N字符串
scan.nextLine();
//用户姓名 m个
String[] user_name = new String[m];
for(int i = 0 ; i < m ; i++){
user_name[i] = scan.nextLine();
}
//用户关系 M条
Map<String , HashSet<String>> map = new HashMap<String , HashSet<String>>();
for(int i = 0 ; i < m ; i++){
HashSet<String> set = new HashSet<String>();
map.put(user_name[i], set);
}
//添加关系
for(int i = 0 ; i < M ; i++){
String[] relation = scan.nextLine().split(" ");
map.get(relation[0]).add(relation[1]);
map.get(relation[1]).add(relation[0]);
}
//如果用户A和用户B不是好友,当两人共同好友数量超过阈值P时,推荐为彼此好友
recommendedFriend(p , m , user_name ,map);
//查询某个用户的好友数量
String[] query = new String
;
for(int i = 0 ; i < n ; i++){
query[i] = scan.nextLine();
}
//打印指定用户好友数量
printNumberOfFriend(query , n , map);
//查询指定两个用户是否是好友
String[] isFriend = new String
;
for(int i = 0 ; i < N ; i++){
isFriend[i] = scan.nextLine();
}
queryIsFriend(isFriend , N , map);
}
scan.close();
}
private static void queryIsFriend(String[] isFriend , int N , Map<String , HashSet<String>> map){
String[] judge_relation = new String[2];
for(int i = 0 ; i < N ; i++){
judge_relation = isFriend[i].split(" ");
if(map.get(judge_relation[0]).contains(judge_relation[1])){
System.out.println("0");
}else{
System.out.println("-1");
}
}
}
private static void printNumberOfFriend(String[] query , int n ,Map<String , HashSet<String>> map){
for(int i = 0 ; i < n ; i++){
//如果用户存在
if(map.containsKey(query[i])){
System.out.println(map.get(query[i]).size());
}else{
System.out.println("-1");
}
}
}
private static void recommendedFriend(int p , int m , String[] user_name ,Map<String , HashSet<String>> map){
//尝试给m个用户推荐好友
//1.本身不是好友 2.好友数量达到阈值
int count = 0;//统计共同好友的个数
for(int i = 0 ; i < m - 1 ; i++){
for(int j = i + 1 ; j < m ; j++){
//彼此不是对方的好友
if(map.get(user_name[i]).contains(user_name[j])){
continue;
}else{
for(int k = 0 ; k < m ; k++){
if(map.get(user_name[i]).contains(user_name[k]) && map.get(user_name[j]).contains(user_name[k])){
count++;
}
}
//如果共同好友数量大于阈值,推荐为彼此好友
if(count >= p){
map.get(user_name[i]).add(user_name[j]);
map.get(user_name[j]).add(user_name[i]);
}
}
}
}
}
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树