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

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

Easy 简单密码

简要题意

给一个含大小写字母及数字的字符串。

将小写字母改为对应九键上的数字,大写字母改为循环右移一位的小写。

Solution

直接模拟修改即可。

注意到前几键都代表三个字母,所以用等差性质简化了一下代码。

Code

void R()
{
	string s;
	cin>>s;
	for (char &c:s)
		if (!isdigit(c))
		{
			if (c>='A'&&c<='Z')
				c=(c-'A'+1)%26+'a';
			else if (c<='r')
				c=(c-'a')/3+2+'0';
			else if (c<'t')
				c='7';
			else if (c<'w')
				c='8';
			else c='9';
		}
	cout<<s;
	return;
}

Medium 蛇形矩阵

简要题意

输出规模为 的满足下面规律的上三角矩阵。

Solution

不难注意到每行都是一个二阶等差数列,第一列是 ,枚举输出即可。

Code

void R()
{
	int n;
	cin>>n;
	for (int i=1;i<=n;i++)
	{
		int t=i*(i-1)/2+1;
		cout<<t<<" \n"[i==n];
		for (int j=i+1;j<=n;j++)
		{
			t+=j;
			cout<<t<<" \n"[j==n];
		}
	}
	return;
}

Hard 火车进站

简要题意

个元素以某个顺序入栈,中间出栈时机不定。

求所有使元素全部出栈的合法出栈序列,要求按字典序输出。

Solution

事实上方案数就是 Catalan Number,但这里不需要用到。

0 表示入栈,1 表示出栈。01 的全排列一定覆盖了所有答案。

next_permutation() 枚举全排列,模拟判断当前排列是否合法,并将出栈序列存到一个 vector 里,枚举完 sort() 一下就能输出了。

时间复杂度是跟答案规模同阶的,肯定不会超时。

Code

void R()
{
	int n;
	cin>>n;
	vector<int> tmp(2*n),a(n);
	vector<vector<int>> ans;
	for (int &x:a) cin>>x;
	for (int i=n;i<2*n;i++) tmp[i]=1;
	do
	{
		int now=0;
		vector<int> stk,ord;
		for (int x:tmp)
			if (x)
			{
				if (stk.empty()) goto ed;
				else
				{
					ord.push_back(stk.back());
					stk.pop_back();
				}
			}
			else stk.push_back(a[now++]);
		ans.push_back(ord);
		ed:;
	} while (next_permutation(tmp.begin(),tmp.end()));

	sort(ans.begin(),ans.end());
	for (auto &v:ans)
		for (int i=0;i<n;i++)
			cout<<v[i]<<" \n"[i+1==n];
	return;
}
#牛客春招刷题训练营#
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 12:23
转人工😡
门口唉提是地铁杀:五次握手了
点赞 评论 收藏
分享
每晚夜里独自颤抖:要求太多的没必要理
点赞 评论 收藏
分享
05-29 09:02
门头沟学院 Java
点赞 评论 收藏
分享
07-09 15:14
南京大学 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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