牛客春招刷题训练营 - 2025.5.22 题解

活动地址:牛客春招刷题训练营 - 编程打卡活动

Easy 变幻莫测

简要题意

给定两个整数 ,可以执行任意次操作,操作有下面两种:

  • 交换

求使 的最小操作次数,或报告无解。

Solution

状态数很少,BFS 即可。

需要注意的是,允许运算中间有数超出读入数据范围。

Code

void R()
{
	map<pair<int,int>,bool> vis;
	int X,Y,ans=-1;
	cin>>X>>Y;
	queue<tuple<int,int,int>> q;
	vis[{X,Y}]=1;
	q.push({X,Y,0});
	while (!q.empty())
	{
		auto [x,y,d]=q.front();
		q.pop();
		if (x==y)
		{
			ans=d;
			break;
		}
		if (!vis.count({y,x}))
			vis[{y,x}]=1,q.push({y,x,d+1});
		if (!vis.count({x+y,x-y})&&abs(x+y)<=1000&&abs(x-y)<=1000)
			vis[{x+y,x-y}]=1,q.push({x+y,x-y,d+1});
	}
	cout<<ans;
	return;
}

Medium 平均数为k的最长连续子数组

简要题意

给定一个数组,求平均数为k的最长连续子数组。

Solution

将所有数减去 ,问题转化为求前缀和相同的两个位置的最远距离。

Code

void R()
{
	int n,k,ans=-1;
	cin>>n>>k;
	vector<i64> a(n+1);
	map<i64,vector<int>> pos;
	for (int i=1;i<=n;i++)
		cin>>a[i],a[i]-=k;
	partial_sum(a.begin(),a.end(),a.begin());
	for (int i=0;i<=n;i++)
		pos[a[i]].push_back(i);
	for (auto &[t,v]:pos)
		if (v.size()>1)
			ans=max(ans,v.back()-v[0]);
	cout<<ans;
	return;
}

Hard 最大子矩阵

简要题意

给定一个矩阵,求其权值最大的非空子矩阵。

Solution

一个简单的想法是 枚举子矩阵,但是时限比较紧张。

考虑先只枚举子矩阵的上下是哪行,中间做一次前缀和,就变成求最大子段和,可以 处理。

Code

void R()
{
	int n,ans=-1e9;
	cin>>n;
	vector<vector<int>> a(n+1,vector<int>(n+1));
	for (int i=1;i<=n;i++)
		for (int j=1;j<=n;j++)
		{
			cin>>a[i][j];
			a[i][j]+=a[i-1][j];
		}

	for (int l=1;l<=n;l++)
		for (int r=l;r<=n;r++)
		{
			vector<int> tmp(n+1);
			for (int i=1;i<=n;i++)
			{
				tmp[i]=a[r][i]-a[l-1][i];
				tmp[i]+=max(tmp[i-1],0);
				ans=max(ans,tmp[i]);
			}
		}
	cout<<ans;
	return;
}
#牛客春招刷题训练营#
全部评论

相关推荐

05-28 19:08
已编辑
门头沟学院 Java
突然收到面试邀请,而且没有hr电话直接就甩了个晚上的面试链接。自我感觉答得不好,估计是挂了,但面试官人很好,氛围相对轻松。public、protected、default、private​重写和重载区别JVM内存模型​类加载过程,字节码加载过程​OOM​AOP​讲讲RPC​算法题:二分查找+测试用例​TCP/IP四层模型​,那一层是IP、那一层是端口​TCP和UDP区别​三次握手及为什么三不能是两次GET和POST区别​Linux&nbsp;的命令​,查看CPU情况介绍一下做过的项目​电商退款有哪些测试用例​死锁是什么及其原因​慢查询原因及如何定位慢查询​什么字段适合建立索引?innoDB跟myISAM...
一笑而过2222:1. Linux查看CPU情况:使用 top 可实时查看系统CPU整体及各进程占用率,按 1 能展示每个核心运行状态; htop 以可视化界面增强交互性; mpstat -P ALL 精准统计每个CPU核心负载; lscpu 输出CPU架构、缓存等硬件信息; vmstat 综合展示CPU、内存、IO等资源使用趋势; sar -u 基于历史数据统计CPU负载; nproc 直接获取CPU核心数量。实际分析时,先用 top 快速定位异常,再结合 mpstat 等深入排查。 2. 电商退款测试用例:功能测试覆盖全额/部分退款、不同发货状态处理、退款金额计算及多渠道返还;异常测试包含重复退款、越权操作、网络中断恢复;业务规则聚焦退款时效控制、优惠券分摊逻辑、高频退款风控;同时补充兼容性(多终端适配)和性能测试(高并发场景响应),保障退款流程稳定可靠。 3. 死锁及其原因:死锁是多进程/线程因资源竞争形成互相等待、无法推进的阻塞状态,需同时满足互斥(资源独占)、请求保持(占有资源时请求其他资源)、不可剥夺(资源不能被强制释放)、循环等待(形成资源等待环路)四个条件。常见于数据库事务交叉锁定、多线程无序获取锁等场景,可通过资源预分配、顺序加锁预防,依赖日志或线程Dump分析检测。 4. 慢查询原因及定位:慢查询根源在于索引失效(未命中或设计不当)、数据量过大导致全表扫描、复杂查询(嵌套子查询、大量JOIN)、锁冲突(行锁升级表锁)、服务器资源瓶颈(CPU/IO过载)。定位时,先启用慢查询日志并用 pt-query-digest 分析高频慢SQL,再通过 EXPLAIN 剖析执行计划,结合 SHOW ENGINE INNODB STATUS 排查锁等待,必要时借助 Performance Schema 监控资源消耗。 5. 适合建索引的字段:优先对高频出现在 WHERE 、 JOIN 、 ORDER BY 子句中的字段建索引,尤其是高选择性字段(如身份证号、手机号);组合索引遵循最左前缀原则;写入频繁字段谨慎建索引,避免影响性能;大字段类型可使用前缀索引优化查询。 6. InnoDB与MyISAM区别:InnoDB支持事务、外键和行级锁,采用聚簇索引存储数据,适合高并发读写场景,具备崩溃恢复能力;MyISAM使用表级锁,无事务支持,索引与数据分离存储, COUNT(*) 统计高效,但不适用于写密集业务。生产中InnoDB用于核心交易模块,MyISAM适用于只读统计类表。 7. InnoDB锁及表锁升级:InnoDB提供共享锁、排他锁、间隙锁等多种锁机制,并通过MVCC减少冲突。表锁升级常发生于SQL无法命中索引引发全表扫描、大事务更新大量数据导致自适应哈希索引失效、执行 ALTER TABLE 等DDL操作,以及死锁检测后强制升级场景。优化需确保索引覆盖查询,拆分大事务降低锁粒度。
查看20道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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