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

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

Easy 字符个数统计

简要题意

数一个字符串中的互异字符数。

Solution

标记一下每个字符是否见过即可。

Code

void R()
{
	map<char,bool> vis;
	string s;
	cin>>s;
	for (char c:s)
		vis[c]=1;
	cout<<vis.size()<<'\n';
	return;
}

Medium 删除字符串中出现次数最少的字符

简要题意

如标题所述。

Solution

记录一下各个字符出现次数,取出最小值,再输出原字符串。

特别地,如果当前输出字符的出现次数等于最小值,将其跳过。

Code

void R()
{
	vector<int> vis(26);
	string s;
	cin>>s;
	for (char c:s)
		vis[c-'a']++;

	int mn=1e9;
	for (int i=0;i<26;i++)
		if (vis[i])
			mn=min(mn,vis[i]);
	for (char c:s)
		if (vis[c-'a']!=mn)
			cout<<c;
	return;
}

Hard 四则运算

简要题意

给一个简单的算术表达式,求其结果。

Solution

还是小模拟。

其实编程求后缀表达式值比求中缀更容易,所以我直接把它转成后缀。

具体来说就是:

用一个栈存符号,遍历中缀表达式。

如果遍历到的是数字,直接丢进表达式;

如果遍历到的是算术运算符,把栈顶优先级不低于它的运算符丢进表达式(遇到左括号也要停下),自己进栈;

如果遍历到的是左括号,直接丢进栈里;

如果遍历到的是右括号,一直弹栈到最近的左括号,弹出来的符号都插进表达式里。

需要留意的是负号 or 减号的处理:如果原表达式中 - 前面不是数字也不是右括号,就说明它是负号,否则就是减号。负号前面补个 就可以一起处理。

对于后缀表达式,它没有烦人的括号,我们遇到一个算符就把最近两个数拿来算就好。

Code

void R()
{
	string s;
	cin>>s;
	vector<int> sgn,val,exp;
	constexpr int S=1e3+7;

	auto isr=[&](char c)->bool
	{
		return c==')'||c==']'||c=='}';
	};

	for (int i=0;i<s.size();i++)
	{
		char c=s[i];
		if (isdigit(c))
		{
			if (i&&isdigit(s[i-1]))
			{
				exp.back()*=10;
				exp.back()+=c-'0';
			}
			else exp.push_back(c-'0');
		}
		else if (isr(c))
		{
			while (sgn.back()!=S)
			{
				exp.push_back(sgn.back());
				sgn.pop_back();
			}
			sgn.pop_back();
		}
		else if (c=='+'||c=='-')
		{
			while (!sgn.empty()&&sgn.back()!=S)
			{
				exp.push_back(sgn.back());
				sgn.pop_back();
			}
			if (c=='-'&&(!i||(!isdigit(s[i-1])&&!isr(s[i-1]))))
				exp.push_back(0);
			sgn.push_back(c=='+'?S+1:S+2);
		}
		else if (c=='*'||c=='/')
		{
			while (!sgn.empty()&&sgn.back()>S+2)
			{
				exp.push_back(sgn.back());
				sgn.pop_back();
			}
			sgn.push_back(c=='*'?S+3:S+4);
		}
		else sgn.push_back(S);
	}
	while (!sgn.empty())
	{
		exp.push_back(sgn.back());
		sgn.pop_back();
	}

	for (int x:exp)
	{
		if (x<S)
			val.push_back(x);
		else
		{
			int p=val.back();
			val.pop_back();
			if (x==S+1)
				val.back()+=p;
			else if (x==S+2)
				val.back()-=p;
			else if (x==S+3)
				val.back()*=p;
			else
				val.back()/=p;
		}
	}
	cout<<val.back();
	return;
}
#牛客春招刷题训练营#
全部评论

相关推荐

Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
程序员小白条:找的太晚,别人都是大三实习,然后大四秋招春招的,你大四下了才去实习,晚1年
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-08 10:39
一个证都没&nbsp;我能填什么
程序员小白条:别人有,你为什么没有,还是这个道理,社会就是比较,竞争,淘汰,你要安逸,那么就要做好淘汰的准备
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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