小红书开发笔试题解

总体还是比较易,70分钟ak..(代价是鸽了今天的acm预选赛)
4个题,都是现场ac代码一点没改,不怎么好看。

第一题,给出用户的关注,互相关注的人在一个圈子里,并且有传递性。问总计有几个圈子。
裸并查集,或者忽视单向边跑一遍图有几个连通块,都是线性(并查集是接近线性)的复杂度。
#include <bits/stdc++.h>
using namespace std;
#define LL long long
int u[1005];
void init(int size)
{
	for (int i = 0; i < size; i++) u[i] = -1;
}
int find(int x)
{
	if (u[x] < 0) return x;
	u[x] = find(u[x]);
	return u[x];
}
void mix(int x, int y)
{
	if ((x = find(x)) == (y = find(y))) return;
	if (u[x] < u[y])
		u[x] += u[y], u[y] = x;
	else
		u[y] += u[x], u[x] = y;
}

int main()
{
	int i, j;
	int n;
	while (~scanf("%d", &n))
	{
		init(n);
		int temp;
		for (i = 0; i < n; i++)
			for (j = 0; j < n; j++)
			{
				scanf("%d", &temp);
				if (temp == 1)
					mix(i, j);
			}
		int ans = 0;
		for (i = 0; i < n; i++)
			if (u[i] < 0)
				ans++;
		printf("%d\n", ans);
	}
	return 0;
}
第二题,字符串的处理,删除所有括号内的内容(可能嵌套但一定成对),然后有<的删除它和它的前一个字符(如果有的话)
按照题意模拟就行..
#include <bits/stdc++.h>
using namespace std;
#define LL long long
char s[10005];
char ss[10005];
int main()
{
	int i, j;
	while (~scanf("%s", s))
	{
		int count = 0;
		j = 0;
		for (i = 0; s[i]; i++)
		{
			if (s[i] == '(')
				count++;
			if (count == 0)
				ss[j++] = s[i];

			if (s[i] == ')')
				count--;
		}
		j = 0;
		for (i = 0; ss[i]; i++)
		{
			if (ss[i] == '<')
			{
				j--;
				j = max(0, j);
				continue;
			}
			ss[j++] = ss[i];
		}
		ss[j] = 0;
		puts(ss);
		
	}
	return 0;
}
第三题,给一个数组,从中取出一些数,保证取出的数位置不连续,和最大,且和最大的里取到的数的数目最少。问和多少,取几个数。数据范围1000
肯定往动态规划上想..(都是正数的话或许贪心也可?)
dp[i][j]表示最后一个取i,总计取了j个时的总和,有dp[i][k + 1] = max(dp[i][k + 1], dp[j][k] + a[i]),j取0到i-2,k取0-i。
这是O(n^3)的复杂度,不一定能过,但是有几个剪枝:都是正数的话,为了总和最大不可能连续空3个或以上,j只有3种取值(忘记题目是不是说都是正数了..),不连续取k一定小于等于i/2+1。
其实O(n^3)就能过...
开始想着用la数组记录父节点,能少一维,没啥必要..就申请了初始化了但没用
#include <bits/stdc++.h>
using namespace std;
#define LL long long
int dp[1005][1005], la[1005];
int a[1005];
int main()
{
	int i, j, k;
	int n;
	while (~scanf("%d", &n))
	{
		memset(dp, 0, sizeof(dp));
		memset(la, -1, sizeof(la));
		for (i = 0; i < n; i++)
			scanf("%d", a + i);
		dp[0][1] = a[0];
		dp[1][1] = a[1];
		for (i = 2; i < n; i++)
			for (j = 0; j < i - 1; j++)
				for (k = 0; k <= i / 2 + 1; k++)
				{
					dp[i][k + 1] = max(dp[i][k + 1], dp[j][k] + a[i]);
				}
		int ma = 0, co = 1005;
		for (i = 0; i < n; i++)
			for (j = 0; j < n; j++)
			{
				if (dp[i][j] > ma || (dp[i][j] == ma && j < co))
					ma = dp[i][j], co = j;
			}
		printf("%d %d\n", ma, co);
	}
	return 0;
}

第四题,相当于给n个二维坐标,求最长不减折线最多经过多少个点。1e6范围。
开始以为是nlogn的最长上升子序列,快写完才发现和顺序没有关系..(然而就算是最长上升子序列也不对
不限复杂度就dp一下,n^2时间,但是1e6肯定8行。
考虑降维,对坐标的xy排序,这样每个点x值一定大于等于它前面所有的点x,就可以无视x值只看y值了。
然后按照dp的思想,dp[i]=max(dp[j])+1,j<i且j.y≤i.y。
所以维护一个数组a,a[i]表示当前最后一个点纵坐标为i的序列的最大长度。
需要logn的查询区间最大值和更新,套个线段树就行。
注意数组a大小不是n,是纵坐标最大值。(还好纵坐标给的小,不然害得套个哈希)
一个大坑,给的数据范围是大于0,然而有等于0的数据,导致运行错误..所以代码里对所有y值加一。

#include <bits/stdc++.h>
using namespace std;
#define LL long long
struct poi { int x, y; }a[1000005];

struct { int l, r, n; }t[1000005 << 2];
void build(int l, int r, int i)
{
	t[i].l = l, t[i].r = r, t[i].n = 0;
	if (l == r)
		return;
	int mid = (l + r) >> 1;
	build(l, mid, i << 1), build(mid + 1, r, i << 1 | 1);
}
void update(int i, int x, int k)
{
	t[k].n = max(t[k].n, x);
	if (t[k].l == t[k].r)
		return;
	int mid = (t[k].l + t[k].r) >> 1;
	if (i <= mid)
		update(i, x, k << 1);
	else
		update(i, x, k << 1 | 1);
}
int sea(int l, int r, int k)
{
	if (t[k].l == l && t[k].r == r)
		return t[k].n;
	int mid = (t[k].r + t[k].l) >> 1;
	if (r <= mid)
		return sea(l, r, k << 1);
	if (l > mid)
		return sea(l, r, k << 1 | 1);
	return max(sea(l, mid, k << 1), sea(mid + 1, r, k << 1 | 1));
}
int cmp(poi a, poi b)
{
	if (a.x == b.x)
		return a.y < b.y;
	return a.x < b.x;
}
int main()
{
	int i, j, k;
	int n;
	while (~scanf("%d", &n))
	{
		int ma = 0;
		for (i = 1; i <= n; i++)
		{
			scanf("%d%d", &a[i].x, &a[i].y);
			a[i].y++;
			ma = max(ma, a[i].y);
		}
		sort(a + 1, a + n + 1, cmp);
		build(1, ma, 1);
		for (i = 1; i <= n; i++)
		{
			int temp = sea(1, a[i].y, 1);
			update(a[i].y, temp + 1, 1);
		}
		printf("%d\n", sea(1, ma, 1));
	}
	return 0;
}



#题解##小红书#
全部评论
第三题,不连续子数组最大和那个,三重循环最内层 for (k = 0; k <= i / 2 + 1; k++) 是不是应该改成 for (k = 0; k <= i / 2 + 1 && k<=j; k++) k>j的时候 dp[j][k]没有意义啊😂
点赞 回复 分享
发布于 2019-09-17 15:56
大佬,第三题的第22行dp[i][k + 1] = max(dp[i][k + 1], dp[j][k] + a[i]); 是不是应该是dp[i][k + 1] = max(dp[i-1][k], dp[j][k] + a[i])????求解答
点赞 回复 分享
发布于 2019-09-15 15:00
大佬tql 最后两题不会
点赞 回复 分享
发布于 2019-09-15 10:21
AC了三道,最后一道题没时间了,瞎几把输出3通过了18🤣
点赞 回复 分享
发布于 2019-09-14 17:17
大佬
点赞 回复 分享
发布于 2019-09-14 17:09
大佬tql
点赞 回复 分享
发布于 2019-09-14 17:08
这是大佬。我算法A了2.1/3...感觉已凉
点赞 回复 分享
发布于 2019-09-14 17:06
tql
点赞 回复 分享
发布于 2019-09-14 17:05
大佬
点赞 回复 分享
发布于 2019-09-14 17:03

相关推荐

背景:&nbsp;本人西北大学软件工程专业大二,投递/被邀请的是腾讯云智相关产品实习岗位,方向和音视频&nbsp;PaaS、实时互动、云产品相关。之前没有大厂实习经历,主要准备内容是自己的&nbsp;AI&nbsp;学习导航系统项目,以及腾讯云&nbsp;TRTC、IM、PaaS、实时音视频的一些基础理解。这次是二面,结果暂时等待通知。整体体验比较好,面试官追问比较深入,不是压力面,更像围绕项目、AI趋势和岗位匹配度做讨论。一、开场和自我介绍开头先做了环境调试,确认收音和画面。之后是自我介绍。我主要介绍了自己的专业背景:软件工程大二,平时对技术和人文学科结合比较感兴趣,所以不只关注纯开发,也会关注产品、用户、技术趋势这些问题。然后解释了为什么会接受腾讯云产品岗的面试:一方面是对云产品和音视频方向感兴趣,另一方面也觉得实时互动和多模态&nbsp;AI&nbsp;的发展有连接点。二、项目深挖:AI学习导航系统这一部分是面试重点。我讲的是自己做的&nbsp;AI&nbsp;学习导航系统。项目背景是:很多大学生使用大模型时,只是把它当作搜索引擎,没有真正利用大模型做学习过程中的认知辅助。所以我希望做一个不是单纯聊天框的系统,而是通过学习流程和提示词脚手架,引导用户完成学习任务。我讲了系统的五阶段流程:目标输入学情诊断个性化规划任务执行总结报告任务执行阶段又拆成四步:结构建立知识理解费曼输出反思总结技术实现方面,我提到前端用&nbsp;Vue,后端主要调用&nbsp;DeepSeek、Claude、GPT-4&nbsp;等模型&nbsp;API,项目部署在云服务器上。这个地方没有展开太多技术细节,因为面试官更关注产品逻辑和问题价值。面试官主要追问:1.&nbsp;这个项目解决的核心问题是什么?2.&nbsp;为什么用户需要这样的学习流程?3.&nbsp;它和普通&nbsp;AI&nbsp;聊天工具有什么区别?4.&nbsp;用户反馈有没有做?5.&nbsp;项目目前还有哪些不足?我的感受是,产品岗讲项目时,不能只说“我做了什么功能”,一定要讲清楚“为什么要做这个功能”。尤其是没有实习经历的同学,自己的项目就是最重要的证明材料。三、AI编程和教育方向讨论面试中还聊到了&nbsp;AI&nbsp;编程对教育的影响。我表达的观点是:未来很多细碎的工程实现会被&nbsp;AI&nbsp;降低门槛,比如普通接口、页面、项目脚手架等。但计算机基础不会因此变得不重要,反而会更重要。因为&nbsp;AI&nbsp;能生成代码之后,人更需要判断代码是否正确、系统是否合理、问题核心在哪里。面试官追问了一个问题:如果&nbsp;AI&nbsp;生成的代码有深层漏洞,仅靠基础知识能否&nbsp;Review&nbsp;出来?我回答的大意是:不能完全依赖基础知识,也不能完全依赖&nbsp;AI。未来更可能是人和&nbsp;AI&nbsp;协同排查,人负责抓核心矛盾和判断方向,AI&nbsp;辅助定位和解释细节。四、大模型幻觉相关问题面试官问到了大模型幻觉的问题。我提到了两个比较常见的方向:RAG,也就是检索增强生成提示词约束,通过结构化&nbsp;Prompt&nbsp;降低模型乱答概率面试官又补充了一种更严谨的方向,大概是通过数学证明、可验证代码、形式化方法来解决幻觉问题。这个地方我没有答得特别深入,但感觉面试官也不是要求我完全掌握,而是看我有没有基本认知,以及能不能接住进一步讨论。五、英语能力和信息获取面试官问了英语能力。我说四级&nbsp;600&nbsp;左右,六级&nbsp;460&nbsp;左右,六级没有专门备考。平时会用&nbsp;Grok、英文搜索、YouTube&nbsp;技术视频获取海外&nbsp;AI&nbsp;和技术动态。这个地方建议大家不要只说“我英语还可以”,最好补一句你平时怎么用英语获取信息,会更有说服力。六、职业规划和实习时间面试官问了职业规划。我说自己目前还在考研和就业之间摇摆,但越来越倾向于进入企业解决真实问题,尤其是&nbsp;AI&nbsp;应用、云产品、音视频基础设施这类方向。同时也说明了自己可以协调学校课程,保证每周&nbsp;4&nbsp;天左右的实习时间。七、对腾讯云音视频方向的理解我提到自己比较关注&nbsp;TRTC&nbsp;和&nbsp;IM。我的理解是,音视频不只是直播、会议这些单点场景,它可能会成为未来多模态&nbsp;AI&nbsp;应用的重要基础设施。因为人最自然的交互方式不是文字,而是声音、画面、表情和实时上下文。未来&nbsp;AI&nbsp;如果进入教育、会议、客服、办公协作等场景,实时音视频能力会非常关键。这个观点面试官没有明显否定,后续也围绕实时互动行业认知给了我一些建议。八、反问环节我主要问了:后续流程大概有几轮作为候选人,后续应该重点提升哪些能力面试官反馈大概是,日常实习生流程可能比正式招聘短一些,后续建议重点深化实时互动行业认知,同时处理好学业和实习时间。九、个人复盘答得比较好的地方:1.&nbsp;AI&nbsp;学习导航系统这个项目讲得比较完整,能说明背景、流程和设计逻辑。2.&nbsp;能把自己的项目和&nbsp;AI、教育、产品能力联系起来。3.&nbsp;对音视频和多模态&nbsp;AI&nbsp;的连接有自己的理解。4.&nbsp;面试过程中没有完全背答案,整体比较像真实讨论。不足的地方:1.&nbsp;用户反馈不够结构化,项目还缺少更真实的数据验证。2.&nbsp;对音视频&nbsp;PaaS&nbsp;的行业理解还比较浅,准备时间短。3.&nbsp;大模型幻觉相关问题只答到了&nbsp;RAG&nbsp;和&nbsp;Prompt,更深的形式化验证、可验证代码等方向了解不够。4.&nbsp;职业规划还可以更坚定一些,不要显得太摇摆。十、给类似同学的建议如果你也是低年级、没有实习经历,但想面产品岗,我觉得最重要的是准备好一个能讲深的项目。不要只背产品八股,也不要只堆技术名词。面试官真正会追问的是:你为什么做这个项目?你看到了什么问题?你怎么拆解?你怎么判断有效?你后面准备怎么迭代?低年级不是完全劣势。只要能体现快速学习能力、结构化表达能力、项目思考深度和对行业的兴趣,还是有机会把面试聊起来的。目前结果等待通知,后续有进展再更新。
查看12道真题和解析
点赞 评论 收藏
分享
评论
点赞
28
分享

创作者周榜

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