小红书 4.9 实习笔试第一题
笔试第一题一看就不会输入输出了,到现在都没用树把这题实现,晚上采用哈希和深度优先搜寻实现了,大佬知道怎么用树实现可以发给我看看
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
unordered_map<int,vector<int>> map;
int dfs(int n)
{
if(map[n].size()==0) return 1;
else
{
if(map[n].size()==1)
{
return 1+dfs(map[n][0]);
}
if(map[n].size()==2)
{
return 1+dfs(map[n][0])+dfs(map[n][1]);
}
}
return 0;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<n;i++)
{
int a,b;
cin>>a>>b;
map[b].push_back(a);
}
vector<int> res(n+1,0);
for(int i=1;i<n+1;i++)
{
cout<<dfs(i)<<' ';
int a=dfs(i);
int b=n-dfs(i);
int cha;
if(a-b>0)
{
cha=a-b;
}
else
{
cha=b-a;
}
res[cha]++;
}
cout<<endl;
for(int i=0;i<n;i++)
{
if(res[i]!=0)
{
cout<<i<<' '<<res[i];
}
}
return 0;
}
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
unordered_map<int,vector<int>> map;
int dfs(int n)
{
if(map[n].size()==0) return 1;
else
{
if(map[n].size()==1)
{
return 1+dfs(map[n][0]);
}
if(map[n].size()==2)
{
return 1+dfs(map[n][0])+dfs(map[n][1]);
}
}
return 0;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<n;i++)
{
int a,b;
cin>>a>>b;
map[b].push_back(a);
}
vector<int> res(n+1,0);
for(int i=1;i<n+1;i++)
{
cout<<dfs(i)<<' ';
int a=dfs(i);
int b=n-dfs(i);
int cha;
if(a-b>0)
{
cha=a-b;
}
else
{
cha=b-a;
}
res[cha]++;
}
cout<<endl;
for(int i=0;i<n;i++)
{
if(res[i]!=0)
{
cout<<i<<' '<<res[i];
}
}
return 0;
}
全部评论
谁说这是二叉树了。。。
题目描述:
输入一棵树 T,你需要删除一条边,这棵树会被分成A 和 B 两棵树。你需要让两部分的节点数的差的绝对值| |A|-|B| |尽可能小。输出最小的| |A|-|B| |和最优方案的数量。
输入描述
第一行一个整数 n表示节点的数量,节点从1 到 n编号。
接下来n-1行每行两个正整数 s t,表示s的父亲是t。
输入保证是一棵树。
对于所有数据 1<=n<=100000。
输出描述
输出一行,两个整数,用空格分开,分别表示最优解和最优方案数。
样例输入
3
2 1
3 1
样例输出
1 2
*/
从根节点开始递归求出每个子树的节点个数,然后就好做了。
相关推荐
点赞 评论 收藏
分享
02-11 13:25
燕京理工学院 数据分析师
在笔试的大西瓜很矫健:校招数分不用想了,这经历和学历都不够用,大厂更别想,初筛都过不了,说点不好听的小厂数分都进不去(小厂也是假数分),要两个对口实习+3个项目(或者3+2),而且要有含金量才能补一点你的学历劣势。
建议刷实习,社招找数分,校招看运气,能入行业就行,可以运营转数分 点赞 评论 收藏
分享
iiooz:别想太多了,面试官如果看不上,就不会约面了,腾讯很少所谓的kpi,有面就说明能力肯定不错,只是每个面试官筛选方式不同,二面甚至只跟你聊生活的都有,鹅还是很开放的在筛选人这一块 点赞 评论 收藏
分享
查看26道真题和解析