当前位置: 面试刷题>> 推荐朋友 (经典算法题500道)


**题目描述**: 在社交网络中,我们有一个用户系统,每个用户都有一个唯一的ID,并且用户可以互相关注形成关注关系。现在,我们想要实现一个功能,即给定一个用户ID,推荐给他/她一些可能感兴趣的新朋友。推荐规则基于该用户的已关注好友的共同关注者(即二度好友),但排除掉该用户已经关注的人。 **输入**: - 用户ID(表示当前用户) - 用户关注关系表(假设为二维数组或类似结构,包含关注者和被关注者的ID对) **输出**: - 一个列表,包含推荐给当前用户的新朋友ID(即共同关注者中未被当前用户关注的用户) **示例**: 假设用户关注关系表如下(`[关注者ID, 被关注者ID]`): ``` [[1, 2], [1, 3], [2, 3], [3, 4], [4, 5], [5, 2]] ``` - 用户1关注了用户2和用户3。 - 用户2关注了用户3。 - 用户3关注了用户4。 - 用户4关注了用户5。 - 用户5关注了用户2(这是一个双向关注示例,但不影响推荐逻辑)。 若给定用户ID为1,我们需要找出用户1的未关注但与其有共同关注者的用户。 **输出**: - 对于用户1,推荐的新用户为:[4, 5](因为用户4和用户5都是用户1的已关注好友(用户2和用户3)的共同关注者,但用户1尚未关注他们)。 **PHP代码示例**: ```php ``` **Python代码示例**: ```python def recommend_friends(user_id, follow_relations): followed_by_me = set() # 存储用户已关注的人 friends_of_friends = set() # 存储二度好友(共同关注者) # 找出用户已关注的人 for relation in follow_relations: if relation[0] == user_id: followed_by_me.add(relation[1]) # 找出二度好友 for friend in followed_by_me: for relation in follow_relations: if relation[0] == friend and relation[1] not in followed_by_me: friends_of_friends.add(relation[1]) return list(friends_of_friends) # 示例 user_id = 1 follow_relations = [[1, 2], [1, 3], [2, 3], [3, 4], [4, 5], [5, 2]] result = recommend_friends(user_id, follow_relations) print(result) # 输出:[4, 5] ``` **JavaScript代码示例**: ```javascript function recommendFriends(userId, followRelations) { const followedByMe = new Set(); // 存储用户已关注的人 const friendsOfFriends = new Set(); // 存储二度好友(共同关注者) // 找出用户已关注的人 for (const [follower, followee] of followRelations) { if (follower === userId) { followedByMe.add(followee); } } // 找出二度好友 for (const friend of followedByMe) { for (const [f, fee] of followRelations) { if (f === friend && !followedByMe.has(fee)) { friendsOfFriends.add(fee); } } } return [...friendsOfFriends]; } // 示例 const userId = 1; const followRelations = [[1, 2], [1, 3], [2, 3], [3, 4], [4, 5], [5, 2]]; const result = recommendFriends(userId, followRelations); console.log(result); // 输出:[4, 5] ``` **码小课**:在码小课网站中,你可以找到更多关于算法和数据结构、网络编程、Web开发等相关内容的分享,帮助你提升编程技能,解决实际问题。
推荐面试题