📣 VIP通行证夏日特惠 限时立减$68
12
返回列表 发新帖
楼主: bobzhang2004
跳转到指定楼层
上一主题 下一主题
收起左侧

Google 一道面经题

🔗
alen231x 2016-2-4 10:49:22 | 只看该作者
全局:
jill_8668 发表于 2016-2-4 04:25
嗯, 您解释清楚了。 但我不确定题目是不是这个意思。 就拿您的例子, 2已经是1的好友了,为啥还要推荐? ...

LZ的题意是说“推荐一个有最多个公共好友的好友”, 我理解的意思就是推荐已有好友中最多公共好友的那个。
不过如果按照您现在的意思,下面是的改过的方法:
第一步://set添加所有好友和自身
unordered_set<int> set;
set.insert(target);
for(auto p : pairs){
if(p.first == target) set.insert(p.second);
if(p.second == target) set.insert(p.first);
}
第二步://统计飞target好友与自己公共好友数量
unordered_map<int, int> mp;
for(auto p : pairs){
   if(set.count(p.first) || set.count(p.second)) {
         if(set.count(p.second) && set.count(p.first) == 0) mp[p.first]++;
         if(set.count(p.first) && set.count(p.second) == 0) mp[p.second]++;
         }
   }
}
第三步:
int maxFrindsNum = INT_MIN, res;
for(auto m : mp){
     if(m.second > maxFriendsNum) {
            res = m.first;
            maxFriendsNum = m.second;
     }
}
return res;

时空复杂度:O(N)
回复

使用道具 举报

🔗
guixi107 2016-2-4 11:18:19 | 只看该作者
全局:
题目的要求是返回所有的friends, 按照popular程度排序(不是返回最popular的那个)
回复

使用道具 举报

🔗
alen231x 2016-2-5 08:07:00 | 只看该作者
全局:
jill_8668 发表于 2016-2-4 04:25
嗯, 您解释清楚了。 但我不确定题目是不是这个意思。 就拿您的例子, 2已经是1的好友了,为啥还要推荐? ...

按照您理解的意思,我的改进方法是
建立一个set存储target本身和他的好友
第一步:
unordered_set<int> set;
set.insert(target);
for(auto p : pairs){
if(p.first == target) set.insert(p.second);
if(p.second == target) set.insert(p.first);
}
第二步:
建立一个map存储target的第二级好友与自己共同好友数量
unordered_map<int, int> mp
for(auto p : pairs){
   if(set.count(p.first) || set.count(p.second)) {
        if(set.count(p.second) && set.count(p.first) == 0) mp[p.first]++;
        if(set.count(p.first) && set.count(p.second) == 0) mp[p.second]++;
   }
}
第三步:
int maxFrindsNum = INT_MIN, res;
for(auto m : mp){
     if(m.second > maxFriendsNum) {
            res = m.first;
            maxFriendsNum = m.second;
     }
}
return res;
时空复杂度:O(N)
回复

使用道具 举报

🔗
alen231x 2016-2-5 08:07:59 | 只看该作者
全局:
guixi107 发表于 2016-2-4 11:18
题目的要求是返回所有的friends, 按照popular程度排序(不是返回最popular的那个)

参照我的第一解法,从mp中取出来后sort一遍就好了~
回复

使用道具 举报

🔗
kittycerry 2016-3-8 15:08:08 | 只看该作者
全局:
你理解错了吧?我怎么觉得是所有朋友的好友中出现频率高的呢?
回复

使用道具 举报

🔗
 楼主| bobzhang2004 2016-3-8 23:10:53 | 只看该作者
全局:
kittycerry 发表于 2016-3-8 15:08
你理解错了吧?我怎么觉得是所有朋友的好友中出现频率高的呢?

你指的出现频率高是什么?是和target有更多相同好友吗?如果是这样,那就是一个意思啊
回复

使用道具 举报

🔗
kittycerry 2016-3-9 05:24:15 | 只看该作者
全局:
我单纯的没看明白你题目的意思。或者你把人家的原帖链接贴一下?谢谢
回复

使用道具 举报

🔗
 楼主| bobzhang2004 2016-3-9 06:36:54 | 只看该作者
全局:
自己写了个java代码
  1. public class FriendsRecommendation {

  2.         class People {
  3.                 String name;
  4.                 HashSet<People> friends;
  5.         }

  6.         class Ele {
  7.                 int count;
  8.                 People people;

  9.                 public Ele(int c, People n) {
  10.                         count = c;
  11.                         people = n;
  12.                 }
  13.         }

  14.         public List<People> findPotentialFriends(People p) {
  15.                 List<People> res = new ArrayList<People>();
  16.                 HashMap<People, Integer> map = new HashMap<People, Integer>();
  17.                 for (People friend : p.friends) {
  18.                         for (People ele : friend.friends) {
  19.                                 if (p.friends.contains(ele)) {
  20.                                         continue;
  21.                                 }
  22.                                 if (!map.containsKey(ele)) {
  23.                                         map.put(ele, 1);
  24.                                 } else {
  25.                                         map.put(ele, map.get(ele) + 1);
  26.                                 }
  27.                         }
  28.                 }

  29.                 PriorityQueue<Ele> pq = new PriorityQueue<Ele>(new Comparator<Ele>() {
  30.                         public int compare(Ele e1, Ele e2) {
  31.                                 return e2.count - e1.count;
  32.                         }
  33.                 });
  34.                 while (!pq.isEmpty()) {
  35.                         res.add(pq.poll().people);
  36.                 }

  37.                 return res;
  38.         }
  39. }
复制代码
回复

使用道具 举报

🔗
 楼主| bobzhang2004 2016-3-9 06:38:32 | 只看该作者
全局:
kittycerry 发表于 2016-3-9 05:24
我单纯的没看明白你题目的意思。或者你把人家的原帖链接贴一下?谢谢

我也忘了从哪复制的。可以看下这个http://www.1point3acres.com/bbs/ ... p;page=1#pid2289946
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表