阿里校招真题+参考代码

树上最短链

【题目描述】

在一个地区有n个城市以及n-1条无向边,每条边的时间边权都是1,并且这些城市是联通的,即这个地区形成了一个树状结构。每个城市有一个等级。

现在小强想从一个城市走到另一个不同的城市,并且每条边经过至多一次,同时他还有一个要求,起点和终点城市可以任意选择,但是等级必须是相同的。

但是小强不喜欢走特别远的道路,所以他想知道时间花费最小是多少。

输入描述:

第一行一个正整数n,含义如题面所述。

第二行n个正整数Ai,代表每个城市的等级。

接下来n-1行每行两个正整数u,v代表一条无向边。

保证给出的图是一棵树。

1≤n≤5000

1≤u,v≤n

1≤Ai≤109

输出描述:

仅一行一个整数代表答案,如果无法满足要求,输出 -1 。

输入样例:

3

1 2 1

1 2

2 3

输出样例:

2

【解题思路】

数据量比较小,直接dfs即可。

【参考代码】

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int n, a[5005], root, ans = 1e9;
vector<int> e[5005];
void dfs(int r, int f, int deep) {
if (r != root && a[r] == a[root])
ans = min(ans, deep);
for (int i = 0; i < e[r].size(); i++)
if (e[r][i] != f)
dfs(e[r][i], r, deep + 1);
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
int i, j, x, y;
cin >> n;
for (i = 1; i <= n; i++)
cin >> a[i];
for (i = 1; i < n; i++) {
cin >> x >> y;
e[x].push_back(y);
e[y].push_back(x);
}
for (i = 1; i <= n; i++) {
root = i;
dfs(i, 0, 0);
}
cout << (ans == 1e9 ? -1 : ans);
return 0;
}

对称飞行器

【题目描述】

小强在玩一个走迷宫的游戏,他操控的人物现在位于迷宫的起点,他的目标是尽快的到达终点。

每一次他可以选择花费一个时间单位向上或向下或向左或向右走一格,或是使用自己的对称飞行器花费一个时间单位瞬移到关于当前自己点中心对称的格子,且每一次移动的目的地不能存在障碍物。

具体来说,设当前迷宫有n行m列,如果当前小强操控的人物位于点A(x,y),那么关于点 A 中心对称的格子B(x',y') 满足x+x'=n+1且y+y'=m+1。

需要注意的是,对称飞行器最多使用5次。

输入描述:

第一行两个空格分隔的正整数n,m分别代表迷宫的行数和列数。

接下来n行 每行一个长度为m的字符串来描述这个迷宫。

其中

. 代表通路。

# 代表障碍。

S 代表起点。

E 代表终点。

保证只有一个S和 一个E 。

2≤n,m≤500

输出描述:

仅一行一个整数表示从起点最小花费多少时间单位到达终点。

如果无法到达终点,输出 -1 。

输入样例:

4 4

#S..

E#..

#...

....

输出样例:

4

说明

一种可行的路径是用对称飞行器到达(4,3)再向上走一步,再向右走一步,然后使用一次对称飞行器到达终点。

【解题思路】

三维广搜,需要额外处理对称位置的转移。

【参考代码】

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
struct node {
int x, y, t;
};
int n, m, sx, sy, ex, ey, v[505][505][6];
int dx[4] = {0, 0, 1, -1}, dy[4] = {1, -1, 0, 0};
char a[505][505];
queue<node> q;
void bfs(int x, int y) {
v[x][y][0] = 1;
int i, j, t, nx, ny;
q.push({x, y, 0});
while (q.size()) {
x = q.front().x, y = q.front().y, t = q.front().t;
q.pop();
for (i = 0; i < 5; i++) {
if (i == 4) {
if (t < 5)
nx = n + 1 - x, ny = m + 1 - y, t++;
else
continue;
} else
nx = x + dx[i], ny = y + dy[i];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && a[nx][ny] != '#' &&
v[nx][ny][t] == 0) {
if (i == 4)
v[nx][ny][t] = v[x][y][t - 1] + 1;
else
v[nx][ny][t] = v[x][y][t] + 1;
if (nx == ex && ny == ey)
return;
q.push({nx, ny, t});
}
}
}
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
int i, j, ans = -1;
cin >> n >> m;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++) {
cin >> a[i][j];
if (a[i][j] == 'S')
sx = i, sy = j;
if (a[i][j] == 'E')
ex = i, ey = j;
}
bfs(sx, sy);
for (i = 0; i < 6; i++)
if (v[ex][ey][i])
ans = v[ex][ey][i] - 1;
cout << ans;
return 0;
}

资料全部内容请看《2025届求职宝典-理工科版

不收费,3人组团即可免费领取!已经发出10000份,涵盖各大公司求职资料,助你事半功倍!

资料包含:

  • 30+大厂面试真题+解析
  • 软件方向:阿里、腾讯、百度、小米、华为、美团......
  • 硬件方向:华为、比亚迪、汇川、新华三、中兴、海康威视......
  • 机械方向:比亚迪、华为、美的、长江存储、宁德时代......
  • 30+大厂岗位薪资爆料
  • 30+大厂offer攻略

拿offer,别犹豫,点击马上领取>>https://www.nowcoder.com/link/campus_ziliao2024-060415

电脑端请微信扫码>>

多说无益,直接上资料截图

每个方向专栏售价69元,但是参与组团就可免费领取

点击马上领取>>https://www.nowcoder.com/link/campus_ziliao2024-060415

全部评论

相关推荐

作为带过好几个实习生的老mentor,我见过有同学带着一腔热血来实习,最后却只带走一份单薄的履历。实习,是你从学校到职场最关键的过渡期,它的价值远不止一份实习证明。今天,我不讲大道理,就从我作为Mentor的视角,给你们几条能立刻用上的建议。记住,你的目标不是当个好学生,而是成为一个值得信赖的职场新人。一、&nbsp;心态转变:从被动答题到主动解题这是我最想强调的一点。学生思维是:等待老师布置明确的作业,然后完成它。职场思维是:主动发现模糊的问题,然后解决它。反面事例:接到任务后,埋头就做,遇到困难不吭声,直到截止日期才说“这个我不会”。Mentor期待的是啥呢?首先是确认目标:接到任务后,先用自己的话复述一遍:“我理解这个任务是要达成XX效果,对吗?”&nbsp;确保方向没错。然后是主动思考:不要只带问题来,要带“选择题”。问“这个数据我不会查,我尝试了A和B方法都失败了,您看是方法C更合适,还是我有其他没考虑到的渠道?”&nbsp;这证明了你的思考和努力。最后是闭环思维:任务完成后,主动告知结果:“XX任务已完成,数据/文件已发您邮箱,并同步在团队网盘了。其中有个小发现是……,供您参考。”&nbsp;让一切有始有终。二、&nbsp;沟通方式:实习生的很多错误,都源于“想当然”和“不敢问”。反面教材:在做一个PPT时,因为不确定公司模板,就套用了自己觉得好看的模板,结果不能用。那么怎么确认,怎么提问呢?第一个,不懂就问,但别重复问:第一次问,是学习;同样的问题问第三次,就是不用心。准备一个笔记本,把关键信息、操作流程、注意事项都记下来。第二个,及时汇报,别等追问:特别是遇到卡壳或可能延期时,一定要提前说。Mentor不怕你慢,就怕你失联。没事儿更新一下进度:目前已完成80%,但在XX环节遇到点阻力,正在想办法沟通等回复,预计今天下班前确定结果,到时候给您,这样说能让人极度安心。第三个,珍惜1on1机会:和Mentor的定期沟通,不是你被动接受批评,而是你主动获取信息和反馈的黄金时间。提前准备好:a)&nbsp;本周工作进展;b)&nbsp;遇到的困惑/挑战;c)&nbsp;希望学习的新技能;d)&nbsp;对团队业务的任何好奇。三、&nbsp;工作习惯:&nbsp;专业性体现在细节里职业素养不是空话,它藏在每一个你容易忽略的细节中。1.&nbsp;邮件/沟通软件礼仪:邮件:标题清晰(如【实习生XX-XX项目周报】),正文称呼得体,结尾有落款。别用“在吗?”开头。工作群:别发表情包刷屏,沟通事情简明扼要。收到任务或通知,回复“收到,谢谢”,这是基本的确认和尊重。2.&nbsp;文件管理与命名:我会观察实习生的桌面,看他们的使用习惯,乱糟糟的桌面说明他没条理。文件命名要使用统一的命名规则:日期_项目名_内容_版本_姓名。例如:20231027_秋招海报_初版_张三。这能为整个团队节省大量沟通成本。3.&nbsp;对待杂活的态度:复印、整理数据、会议纪要……这些dirty&nbsp;work是不可避免的。但优秀的人是能从中找到价值的:整理数据时,可以留意数据之间的关联或异常,做会议纪要时,可以梳理出会议的决策和待办事项。四、&nbsp;终极目标:带走三样东西1.&nbsp;一段能讲出STAR法则的实战经历:这直接决定了你未来求职简历的厚度。2.&nbsp;一位可以为你未来背书的Mentor/同事:好好表现,离职时保持联系,他们可能成为你未来求职的推荐人和内推渠道。3.&nbsp;对行业和岗位的真实认知:通过这次实习,你想清楚自己是更热爱这个行业,还是想赶紧跑路?这个答案,价值千金。最后,作为你们的Mentor,我想说:大胆去试,勇敢去问,别怕犯错。实习期是你犯错成本最低的时候。展现出你的靠谱、主动和思考,我们做Mentor的,会非常乐意把更核心的任务交给你,因为带你,也是在为团队培养未来的战友。希望这些建议能帮你少走弯路,打一场漂亮的实习战!
家族企业:实习一年比在大学多年都有用
第一次找实习,我建议__
点赞 评论 收藏
分享
2025-12-08 07:42
门头沟学院 Java
27届末九,由于是女生,身边人几乎没有就业导向的,自学只能跟着网课,没人指导,很迷茫。下图是我目前的简历,不知道有需要修改的地方吗?求拷打。下面是目前的学习情况:目前算法过完了一遍力扣100和代码随想录,不过不是很熟,面经看了小林coding、JavaGuide,有一些没用过的技术看得不是很明白,掌握得不是很扎实。再加上常年跟黑马网课听思路,真正自己动手写代码的时间很少,这让我一直不敢投简历,总觉得内里空虚。项目没准备好面试相关的问题,简历上相应的考点不熟。如此种种。。。看到很多很多学长学姐大佬们的面经,愈发觉得面试可怕,自己没准备好,总担心自己是不是无望后端开发了。看到牛客很多同届以及更小一届的同学都找到实习了,很希望自己也能找到实习。而自己又好像摸不到后端学习的门路,只能不断赞叹黑马虎哥写的代码真优雅!微服务架构实在巧妙!消息队列、redis、sentinel、nacos、mybatisplus等等的引入都会让我赞叹这些工具的设计者的巧思,以及包括但不限于Java语言的优雅。然而只是停留在了解的程度,并不熟练。我是很希望能够继续深入探索这些知识的,只不过有一大部分时间都花在学校课程上了。我感觉我被困住了,我一方面必须保证我能够有个不错的学业分使我能有我几乎不想选择的读研退路(还有个原因是复习不全我会焦虑考试挂科,因此我会做好全面的准备,而这一步很费时间),一方面在B站学习各种网课,一方面得考虑提升自己并不扎实的算法基础,另一方面还得准备八股面经。这让我有点苦恼,我好像没那么多时间,因为绝大部分时间都花在了复习学校科目中了。我好像处处用时间,但收效甚微。想问问各位大佬是怎么平衡时间的呢?算法、项目和八股是怎么准备的呢?有什么高效的方法吗?谢谢您们花时间阅读我的稿件!
菜菜狗🐶:大胆投,我当时也是害怕面试,投多了发现根本约不到面🤡
点赞 评论 收藏
分享
评论
3
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务