您的位置:首页 > 运维架构 > 网站架构

华为机试---社交网站好友推荐

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]);

     }

    }

   }

  }

 }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 华为