算法基础精选题3.13 模拟

这篇具有很好参考价值的文章主要介绍了算法基础精选题3.13 模拟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一题

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题号:NC16644
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或“4-8”的子串,我们就把它当作一种简写,输出时,用连续递增的字母或数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”。在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活。具体约定如下:
(1)遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号“-”,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右边的字符严格大于左边的字符。
(2)参数 p1p_1p1​:展开方式。p1=1p_1=1p1​=1 时,对于字母子串,填充小写字母;p1=2p_1=2p1​=2 时,对于字母子串,填充大写字母。这两种情况下数字子串的填充方式相同。p1=3p_1=3p1​=3时,不论是字母子串还是数字子串,都用与要填充的字母个数相同的星号“*”来填充。
(3)参数 p2p_2p2​:填充字符的重复个数。p2=kp_2=kp2​=k 表示同一个字符要连续填充 kkk 个。例如,当 p2=3p_2=3p2​=3 时,子串“d-h”应扩展为“deeefffgggh”。减号两侧的字符不变。
(4)参数 p3p_3p3​:是否改为逆序:p3=1p_3=1p3​=1 表示维持原有顺序,p3=2p_3=2p3​=2 表示采用逆序输出,注意这时仍然不包括减号两端的字符。例如当 p1=1、p2=2、p3=2p_1=1、p_2=2、p_3=2p1​=1、p2​=2、p3​=2 时,子串“d-h”应扩展为“dggffeeh”。
(5)如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如:“d-e”应输出为“de”,“3-4”应输出为“34”。如果减号右边的字符按照ASCII码的顺序小于或等于左边字符,输出时,要保留中间的减号,例如:“d-d”应输出为“d-d”,“3-1”应输出为“3-1”。

 文章来源地址https://www.toymoban.com/news/detail-853550.html

输入描述:

第 1 行为用空格隔开的 3 个正整数,依次表示参数 p1,p2,p3p_1,p_2,p_3p1​,p2​,p3​。
第 2 行为一行字符串,仅由数字、小写字母和减号“-”组成。行首和行末均无空格。

输出描述:

输出一行,为展开后的字符串。

示例1

输入

复制1 2 1 abcs-w1234-9s-4zz

1 2 1
abcs-w1234-9s-4zz

输出

复制abcsttuuvvw1234556677889s-4zz

abcsttuuvvw1234556677889s-4zz

示例2

输入

复制2 3 2 a-d-d

2 3 2
a-d-d

输出

复制aCCCBBBd-d

aCCCBBBd-d

示例3

输入

复制3 4 2 di-jkstra2-6

3 4 2
di-jkstra2-6

输出

复制dijkstra2************6

dijkstra2************6

备注:

40%40\%40% 的数据满足:字符串长度不超过5
100%100\%100% 的数据满足:1≤p1≤3,1≤p2≤8,1≤p3≤21 ≤ p_1 ≤ 3, 1 ≤ p_2 ≤ 8, 1 ≤ p_3 ≤ 21≤p1​≤3,1≤p2​≤8,1≤p3​≤2。字符串长度不超过100

 

对于本题其实

很久其实在我刚刚写博客的时候就已经写过,今天重新温故一下这道题

 

首先对于题干很长,我们先多读两遍,接着提取关键信息比方说题干要我们干什么,最终要输出什么,如何实现。那么接下来我们,一步步来拆解。首先对于输出,即要展开的字符串,按照题干,只有出现-时展开  因此直接遍历,并且数组不能越界,那么必须要保证当前遍历字符左边要>=0右边<n  这里直接定义一个新的字符串,如果出现-,则将展开后的内容加入,如果没出现-,则加入当前字符,接着就是实现展开的具体内容。

先有一个大方向,如果出现-后,但是右边刚好是左边的后继,则直接返回“”,如果不满足当前字符两边都是数字字符或者都是字母字符,并且右边严格大于左边,那么返回
“-”  即不展开。接着定义ans字符串作为展开后的字符串加入的字符串,从b+1开始到e-1结束,篇

表示重复的次数。接着由p1确定是否要变成大写,最后由p3确定是否变成*,这么一套逻辑下来,思路清晰了,代码就好实现了。

 

 

#include<bits/stdc++.h>
using namespace std;
int p1, p2, p3;
string s, ans;
string fun(char b, char e, int p1, int p2, int p3)
{
	if (e - b == 1)
		return "";//不展开
	//何时输出“-”;
	if (!((isalpha(b) && isalpha(e) && b < e) ||
		(isdigit(b) && isdigit(e) && b < e)))
	{
		return "-";
	}
	string ans = "";
	//接着将要展开的放到ans
	for (char t = b + 1; t < e; t++)
	{
		for (int i = 0; i < p2; i++)
		{
			ans += t;
		}
	}
	//判断是否大小写
	if (p1 == 2 && isalpha(b) && isalpha(e))
	{
		for (int i = 0; i < ans.length(); i++)
		{
			ans[i] = ans[i] - 'a' + 'A';
		}
	}
	if(p1 == 3)
	{
		for (int i = 0; i < ans.length(); i++)
		{
			ans[i] = '*';
		}
	}
	if (p3 == 2)
	{
		reverse(ans.begin(), ans.end());
	}
	return ans;
}
int main() {
	cin >> p1 >> p2 >> p3;
	cin >> s;
	for (int i = 0; i < s.length(); i++)
	{
		if (s[i] == '-' && i - 1 >= 0 && i+1 < s.length())
			ans += fun(s[i - 1], s[i + 1], p1, p2, p3);
		else
			ans += s[i];
	}
	cout << ans;

	return 0;
}

 

第二题:

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

一元n次多项式可用如下的表达式表示:

f (x) = anxn+ an-1xn-1 + ... + a1x + a0,a0≠0

其中,aixi 称为i 次项,ai 称为i次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:

1. 多项式中自变量为x,从左到右按照次数递减顺序给出多项式。

2. 多项式中只包含系数不为0的项。

3. 如果多项式n次项系数为正,则多项式开头不出现“+”号,如果多项式 n 次项系数为负,则多项式以“-”号开头。

4. 对于不是最高次的项,以“+”号或者“-”号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于0 次的项,其系数的绝对值为1,则无需输出1)。如果x的指数大于1,则接下来紧跟的指数部分的形式为“x^b”,其中b为x的指数;如果x的指数为1,则接下来紧跟的指数部分形式为“x”;如果x的指数为0,则仅需输出系数即可。

5. 多项式中,多项式的开头、结尾不含多余的空格。

输入描述:

第一行1个整数,n,表示一元多项式的次数。
第二行有n+1 个整数,其中第i 个整数表示第n-i+1 次项的系数,每两个整数之间用空格隔开。

输出描述:

共1行,按题目所述格式输出多项式。

示例1

输入

复制5 100 -1 1 -3 0 10

5
100 -1 1 -3 0 10

输出

复制100x^5-x^4+x^3-3x^2+10

100x^5-x^4+x^3-3x^2+10

示例2

输入

复制3 -50 0 0 1

3
-50 0 0 1

输出

复制-50x^3+1

-50x^3+1

备注:

1≤n≤100,多项式各次项系数的绝对值均不超过100。

对于本题,明确一个大的方向,即步步实现先确定系数,再确定符号再确定系数,接着确定x然后确定次数。

我们从后往前遍历,如果当前最高次的系数为负数,那么输出-,否则不用管,因为是首位,如果不是最高次,那么只要系数大于0,那么就输出+小于0就输出-,接着判断系数,如果说系数为-1或者系数为1,并且不是常数项,那么就不输出,否则输出其绝对值,如果是不是常数项或者是一次项,那么输出x……,如果是一次项就直接输出x

#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int a[N];
int main()
{
	int n;
	cin >> n;
	for (int i = n; i >= 0; i--)
		cin >> a[i];
	for (int i = n; i >= 0; i--)
	{
		if (a[i] == 0) continue;//处理特殊情况,系数为0的时候不用输出
			if (i == n)
			{
				if (a[i]<0)
					cout << "-";
			}
			else
			{
				//不是最高项数
				if (a[i] > 0)
				{
						cout << "+";
				}
				else
					cout << "-";
			}
		//接着判断系数
		if ((a[i] == 1 || a[i] == -1) && i != 0)
			;
		else
			cout << abs(a[i]);
		if (i != 1 && i != 0) cout << "x^" << i;
		else if (i == 1) cout << "x";
	}


	return 0;
}

第三题:

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章。

这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换。对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译。

假设内存中有 MMM 个单元,每单元能存放一个单词和译义。每当软件将一个新单词存入内存前,如果当前内存中已存入的单词数不超过 M−1M−1M−1,软件会将新单词存入一个未使用的内存单元;若内存中已存入MMM 个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。

假设一篇英语文章的长度为 NNN 个单词。给定这篇待译文章,翻译软件需要去外存查找多少次词典?假设在翻译开始前,内存中没有任何单词。

 

 

输入描述:

输入共 2 行。每行中两个数之间用一个空格隔开。
第一行为两个正整数 MMM 和 NNN,代表内存容量和文章的长度。
第二行为 NNN 个非负整数,按照文章的顺序,每个数(大小不超过 1000)代表一个英文单词。文章中两个单词是同一个单词,当且仅当它们对应的非负整数相同。

输出描述:

共 1 行,包含一个整数,为软件需要查词典的次数。

示例1

输入

复制3 7 1 2 1 5 4 4 1

3 7
1 2 1 5 4 4 1

输出

复制5

5

说明

整个查字典过程如下:每行表示一个单词的翻译,冒号前为本次翻译后的内存状况:
空:内存初始状态为空。
1. 1:查找单词1 并调入内存。
2. 1 2:查找单词2 并调入内存。
3. 1 2:在内存中找到单词1。
4. 1 2 5:查找单词5 并调入内存。
5. 2 5 4:查找单词4 并调入内存替代单词1。
6. 2 5 4:在内存中找到单词4。
7. 5 4 1:查找单词1 并调入内存替代单词2。
共计查了5次词典。

备注:

对于 10%10\%10% 的数据有 M=1,N≤5M=1,N ≤5M=1,N≤5。
对于100%100\%100% 的数据有 0<M≤1000<M ≤ 1000<M≤100,0<N≤10000<N ≤ 10000<N≤1000

对于本题, vis[N]:标记是否存在该内存中

temp[N]表示一个数组,用来记录加载到内存中的数字的顺序

tempos  用来记录temp数组当前的位置

对于主循环,先输入num  判断是否在字典中,如果在,continue,不在

就把字典数cnt++  接着判断空间是否满,如果满了 ,那么就要把内存中第一个元素踢掉,注意是内存中第一个,用tempos-m表示内存中的第一个,temp[temPos - m]表示当前的数字,vis[temp[temPos - m]]表示是否存在,接着标记该数字存在,然后存入temp中。

如果空间没满,那么标记num 已经放到temp中,接着放入temp  然后count++表示内存多了一个元素

 

 

#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int vis[N], temp[N], temPos, m, n;
int main()
{
	cin >> m >> n;
	int count = 0;//内存空间的数字个数
	int cnt = 0;//查找字典的次数
	int num;//记录输入进来的文章
	int i;
	for (int i = 1; i <= n; i++)
	{
		cin >> num;
		//如果数字在内存空间中,则进入下一次循环
		if (vis[num] == 1)
			continue;
		cnt++;//没在的话就直接查字典数++
		//接着判断空间是否满,如果满了就要置空
		if (count >= m)
		{
			vis[temp[temPos - m]] = 0;// 剔除  对头元素   temp[tempos-m]  //表示这个数被弄掉
			vis[num] = 1;//   标记还在不在
			temp[temPos++] = num;//  字典里数
		}
		else
		{
			vis[num] = 1;
			temp[temPos++] = num;
			count++;
		}
	}
	cout << cnt << endl;



	return 0;
}

 

 

 

 

到了这里,关于算法基础精选题3.13 模拟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 蓝桥杯算法竞赛系列第六章——蓝桥必备篇之模拟、思维

    欢迎回到: 遇见蓝桥遇见你,不负代码不负卿! 目录 一、简单模拟 栗子:换酒问题 栗子:按奇偶排序数组 栗子:害死人不偿命的(3n+1)猜想 栗子:挖掘机技术哪家强 二、查找元素 栗子:找 x 三、图形输出 栗子:跟奥巴马一起编程 四、日期处理 栗子:日期差值 五、进

    2023年04月22日
    浏览(53)
  • 蓝桥杯一维差分 | 算法基础

    ⭐ 简单说两句 ⭐ ✨ 正在努力的小新~ 💖 超级爱分享,分享各种有趣干货! 👩‍💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! 🔒 以下内容仅对你可见~ 作者: 后端小知识 , CSDN后端领域新星创作者 |阿里云专家博主 CSDN 个

    2024年02月03日
    浏览(43)
  • 【LeetCode 算法】Remove Comments 删除注释-模拟

    给一个 C++ 程序,删除程序中的注释。这个程序source是一个数组,其中source[i]表示第 i 行源码。 这表示每行源码由 ‘n’ 分隔。 在 C++ 中有两种注释风格,行内注释和块注释。 字符串// 表示行注释,表示//和其右侧的其余字符应该被忽略。 字符串/* 表示一个块注释,它表示

    2024年02月14日
    浏览(35)
  • [蓝桥杯Python]算法练习、算法基础、算法训练、算法模板(持续更新)

    [蓝桥杯Python]算法练习、算法基础、算法训练、算法模板( 持续更新..... ) 目录 一、算法基础 1.Huffuman树 2.Sine之舞 3.数列排序 4.数列排序 5.特殊回文数 6.回文数 7.特殊的数字 8.杨辉三角形 9.高精度加法 10.Fibonacci数列 11.报时助手 12.回形取数 13.矩阵乘法 二、算法提高 1.印章

    2023年04月08日
    浏览(48)
  • 算法训练day13Leetcode144 145 94 二叉树的前(中)(后)序遍历

    https://www.bilibili.com/video/BV1Hy4y1t7ij/?vd_source=8272bd48fee17396a4a1746c256ab0ae 二叉树的种类 在我们解题过程中二叉树有两种主要的形式:满二叉树和完全二叉树。 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。 什么

    2024年01月15日
    浏览(54)
  • 莲花-第10届蓝桥杯Scratch选拔赛真题精选

    [导读]:超平老师计划推出 Scratch蓝桥杯真题解析100讲 ,这是超平老师解读Scratch蓝桥真题系列的第 99 讲。 蓝桥杯选拔赛每一届都要举行4~5次,和省赛、国赛相比,题目要简单不少,再加上篇幅有限,因此我精挑细选了一部分题目进行解读。 莲花, 本题是第10届蓝桥杯Scratc

    2024年02月04日
    浏览(51)
  • 最小剩余空间-第11届蓝桥杯省赛Python真题精选

    [导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python 蓝桥杯真题解析100讲》, 这是解读系列的第31讲。 最小剩余空间, 本题是2020年6月20日举办的第11届蓝桥杯青少组Pyt

    2024年01月17日
    浏览(49)
  • 小程序面试题 | 13.精选小程序面试题

    🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入

    2024年01月22日
    浏览(70)
  • 【LeetCode 算法】Walking Robot Simulation 模拟行走机器人 - 哈希

    机器人在一个无限大小的 XY 网格平面上行走,从点 (0, 0) 处开始出发,面向北方。该机器人可以接收以下三种类型的命令 commands : -2 :向左转 90 度 -1 :向右转 90 度 1 = x = 9 1 = x = 9 1 = x = 9 :向前移动 x 个单位长度 在网格上有一些格子被视为障碍物 obstacles 。第 i 个障碍物位

    2024年02月15日
    浏览(39)
  • 【LeetCode 算法】Walking Robot Simulation 模拟行走机器人 - 二分

    机器人在一个无限大小的 XY 网格平面上行走,从点 (0, 0) 处开始出发,面向北方。该机器人可以接收以下三种类型的命令 commands : -2 :向左转 90 度 -1 :向右转 90 度 1 = x = 9 1 = x = 9 1 = x = 9 :向前移动 x 个单位长度 在网格上有一些格子被视为障碍物 obstacles 。第 i 个障碍物位

    2024年02月11日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包