推荐朋友 - LintCode
- 拼多多笔试第三题
- 除了题目具体方法值得注意外,数据的输入格外注意
题目
描述
给n个人的朋友名单,告诉你user,请找出user最可能认识的人。(他和user有最多的共同好友且他不是user的朋友)
n <= 500。
好友关系是相互的。(b若出现在a的好友名单中,a一定出现在b的好友名单中)
每个人的好友关系不超过 m 条,m <= 3000。
如果有两个人和user的共同好友数目一样,编号更小的那个认为是最可能认识的人。
如果user和所有陌生人都没有共同好友,输出-1。
样例
给出 list = [[1,2,3],[0,4],[0,4],[0,4],[1,2,3]], user = 0, 返回 4。
解释:
0和4不是朋友,并且他们有3个共同好友。所以4是0最可能认识的人。
给出 list = [[1,2,3,5],[0,4,5],[0,4,5],[0,5],[1,2],[0,1,2,3]], user = 0, 返回 4。
解释:
虽然5和0有3个共同好友,4和0只有2个共同好友,但是5是0的好友,所以4是0最可能认识的人。
解析
- 思路: 首先找到不是user朋友的人,再根据user的朋友名单,计算出和user的共同好友数,结果返回最多共同好友的人。
- 输入:
5 0
1 2 3
0 4
0 4
0 4
1 2 3
#if 1
#include<iostream>
#include<vector>
#include<map>
#include <algorithm>
using namespace std;
int recommendFriends(vector<vector<int>> &friends, int user) {
// Write your code here
if (friends.empty())
return -1;
int num = friends.size();
//res存放不是user的朋友的人与user共同好友的个数
map<int, int> res;
if (friends[user].empty())
return -1;
//dic[i]=1表示i是user或者是user的朋友,dic[i]=0表示i不是user的朋友
vector<int> dic(num, 0);
dic[user] = 1;
for (auto c : friends[user])
{
dic[c] = 1;
}
//找到不是user好友的人
for (int i = 0; i < num; ++i)
{
if (dic[i] == 0)
res[i] = 0;
}
//根据user的好友名单更新res
for (auto c : friends[user])
{
for (auto t : friends[c])
{
if (res.find(t) != res.end())
res[t]++;
}
}
int Max = 0;
int person = -1;
//找到有最多共同好友的人
for (auto c : res)
{
if (c.second > Max)
{
Max = c.second;
person = c.first;
}
}
return person;
}
int main()
{
int N, id;
string str;
getline(cin, str);
stringstream ss(str);
ss >> N >> id;
vector<vector<int>> vec;
//for (int i = 0; i < N; i++)
//{
// vector<int> temp;
// int user;
// getline(cin, str);
// stringstream s(str);
// while (s>>user) //以空格进行划分
// {
// temp.push_back(user);
// }
// vec.push_back(temp);
//}
while (getline(cin, str)) //其实可都可以不知道行数
{
vector<int> temp;
int user;
stringstream s(str);
while (s >> user)
{
temp.push_back(user);
}
vec.push_back(temp);
}
cout << recommendFriends(vec, id) << endl;
return 0;
}
int test()
{
//int N,id;
//cin >> N >> id; //直接输入用户数和需要查找的用户id ; 这样就会产生换行符
int N;
vector<int> in;
char c;
while ((c = cin.get()) != '\n')
{
cin.unget();
cin >> N;
in.push_back(N);
}
vector<vector<int>> vec;
for (int i = 0; i < in[0]; i++)
{
vector<int> temp;
int user;
while ((c=cin.get())!= '\n') //文件结果没有换行符了,所以陷入死循环
{
cin.unget();
cin >> user;
temp.push_back(user);
}
if (temp.size()!=0)
{
vec.push_back(temp);
}
}
cout << recommendFriends(vec, in[1]) << endl;
return 0;
}
#endif
题目参考:
推荐朋友 - LintCode的更多相关文章
- C++ stringstream格式化输出输入探索
- 最近在笔试时经常遇见各种输入问题,于是细心总结一波: - 首先string str; cin>>str;遇到空格结束: - 于是乎产生了getline(),可与得到一行字符串:空格自动 ...
- 推荐一款优秀的WPF开源项目
项目介绍 此项目应用了Prism MVVM框架,项目展示数据来源于其他服务程序,使用的WebAPI通信,如果要正常运行此程序,需要您自己做一个WebAPI程序,由API接口提供数据驱动,其实直接查看代 ...
- 如何优雅地使用Sublime Text
Sublime Text:一款具有代码高亮.语法提示.自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插件扩展机制,用她来写代码,绝对是一种享受.相比于难于上手的Vim,浮肿沉重的Eclip ...
- 我被比特币撞了一下腰——记OKCoin试用体验
本博客还有大量的.NET开源技术文章,您可能感兴趣: 1.开源Math.NET基础数学类库使用系列文章:链接 2.开源C#彩票数据资料库系列文章:链接 3.开源的.NET平台ORM组件文章:链接 4. ...
- CSS3:flex布局应用
想把先前的整理的东西贴出来,怎奈总是有额外事情发生,额,教训电脑要离水杯远点~~ 推荐一本书,<编写可维护的Javascript>这是Nicbolas C.Zakas写的,他的<Ja ...
- 如何优雅地使用 Sublime Text
Sublime Text:一款具有代码高亮.语法提示.自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插件扩展机制,用她来写代码,绝对是一种享受.相比 于难于上手的Vim,浮肿沉重的Ecli ...
- 【网络资料】如何优雅地使用Sublime Text3
如何优雅地使用Sublime Text3 Sublime Text:一款具有代码高亮.语法提示.自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插件扩展机制,用她来写代码,绝对是一种享受.相 ...
- alpha发布用户数
小组名称:天天向上 小组成员:张政.张金生.林莉.胡丽娜 项目内容:连连看 在连连看alpha发布的24小时内,我们将连连看安装包放入各个组员所加入的QQ群内,推荐朋友试玩,用户数达到9人. 现在有A ...
- G面经prepare: Friends Recommendation
想想如果你用linkedin或者facebook, 给你一个人和他的朋友关系网,你会怎么给一个人推荐朋友 一个例子就是A-B, A-C, B - D, B - E, C - D,这个时候问我应该推荐谁 ...
随机推荐
- Android 前台服务
Android 前台服务 学习自 https://blog.csdn.net/guolin_blog/article/details/11952435#t3 前台服务漫谈 我们之前学习的Service ...
- luogu P1502 窗口的星星
题目链接 P1502 窗口的星星 题解 扫描线+线段树 线段树的每一个节点处理的是左边框放在当前x-1位置时的框内星星的亮度大小 按照x坐标进行离散化,得到离散化后每一个坐标x的可影响的范围 维护扫描 ...
- MVVM模式下关闭窗口的实现
通过行为来实现 实现界面与逻辑的分离 窗口关闭行为:其中含有布尔型的Close属性,将相应的关闭行为绑定到该属性上,则可以实现窗口的关闭行为,从而实现VM与View的分离 public class W ...
- oracle创建透明网关出现的问题
解决方案:创建HS_TRANSACTION_LOG表 DROP TABLE HS_TRANSACTION_LOG go CREATE TABLE HS_TRANSACTION_LOG( GLOBAL_ ...
- j.u.c系列(09)---之并发工具类:CyclicBarrier
写在前面 CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).因为该 barrier 在释放等待线程后可以重用,所以 ...
- 【来龙去脉系列】深入理解DIP、IoC、DI以及IoC容器
摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...
- .net core下的dotnet全局工具
.net core 2.1后支持了一个全新的部署和扩展命令,可以自己注册全局命令行. dotnet install tool -g dotnetsaydotnetsay 也可以自己构建自己的命令行,一 ...
- STM32 TIMER REGISTER
- WINUSB Descriptors
Reading string descriptors: String (0x01): "Travis Robinson" String (0x02): "Benchmar ...
- Revit API风管对齐
start [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] ].Origin, list ...