《算法笔记》总结No.2——模拟

一.简单模拟

考察代码能力,不涉及算法:一类题目怎么说你就怎么做的类型~

巴音布鲁克比赛,以车队为基准评选冠军。业务要求是:第一行输入正整数N,代表车手的总个数;接下来的N行每行键入两个数字:分别是车队编号和该车手得分。最终要求输出冠军车队及其得分~


没什么可说的,直接根据数组下标来储存各个队的积分,再升序排列,将最后一位输出即可,如下:

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(int argc, char** argv) 
{
	int N=0;
	cin>>N;
	vector<int> V;
	for(int i=1;i<=N;i++)
		 V.push_back(0);
	for(int i=0;i<=N-1;i++)
	{
		int num=0,count=0;
		cin>>num>>count;
		V[num-1]+=count;
	}
	sort(V.begin(),V.end());
	cout<<"全部分数如下:"<<endl; 
	for(int i=0;i<=N-1;i++)
		if(V[i]!=0)
			cout<<V[i]<<" ";
	cout<<"最大值是:"<<V[N-1]<<endl;
}

博主本人习惯用STL库了,其实用普通的数组和简单的最大值搜索亦可实现~

总的来说,这类纯模拟显示的题目,只需要保证:

  • 数组下标不越界------或者说时间空间不超额
  • STL掌握熟练
  • 结构体使用灵活

一般情况下没有能卡壳的题目~

二.查找元素

小范围的查找直接遍历,范围大时可以使用二分查找(本帖暂不展开~)

键入10个学生信息,将制定班号的学生姓名全部输出:

cpp 复制代码
#include <iostream>
#include <vector>
#include <string> 
using namespace std;

struct student{
	int num; 
	string name;
}; 
int main(int argc, char** argv) 
{
	vector<student> V;
	for(int i=0;i<10;i++)
	{
	 	int num=0;
	 	string name;
	 	student temp;
	 	cin>>num>>name;
	 	temp.name=name;
	 	temp.num=num;
	 	V.push_back(temp);
	}
	int num=0;
	cin>>num;
	for(int i=0;i<=V.size()-1;i++)
		if(V[i].num==num)
			cout<<V[i].name<<" ";
}

同样没什么难度~

三.图形输出

大一C语言常见的阴阳类题目,需要掌握格式化输出的细节~

输入一个数字和某种字符,然后输出一个由该字符组成的、腰长为num的等腰直角三角型:

cpp 复制代码
#include <iostream>
using namespace std;

int main(int argc, char** argv) 
{
	int num=0;
	char goal;
	cin>>num>>goal;
	for(int i=1;i<=num;i++) //外层控制行数
	{
		for(int j=1;j<=i;j++)
			cout<<goal;
		cout<<endl; 
	}	
}

同样很简单,没什么可说的:

四.进制转换

进制转换也是非常常用的基本功,这里博主只给出10进制分别转换为2/8/16进制的代码 ,至于这3种转换为10进制的函数,要考虑很多情况------比如二进制的输入方式,是int、还是vector<int>、string型,这要根据不同输入方式分类讨论~

十进制转二进制:

cpp 复制代码
void TenTo2(int x)
{
	cout<<x<<"的2进制为:";
	vector<int> V;
	while(x!=0)
	{
		int temp=x%2;
		V.push_back(temp);
		x/=2;
	}
	for(int i=V.size()-1;i>=0;i--)
		cout<<V[i];
	cout<<endl;
}

十进制转八进制:

cpp 复制代码
void TenTo8(int x)
{
	cout<<x<<"的8进制为:";
	vector<int> V;
	while(x!=0)
	{
		int temp=x%8;
		V.push_back(temp);
		x/=8;
	}
	for(int i=V.size()-1;i>=0;i--)
		cout<<V[i];
	cout<<endl;
}

十进制转十六进制:

cpp 复制代码
void TenTo16(int x)
{
	cout<<x<<"的16进制为:";
	vector<int> V;
	while(x!=0)
	{
		int temp=x%16;
		V.push_back(temp);
		x/=16;
	}
	for(int i=V.size()-1;i>=0;i--)
	{
		if(V[i]<=9)
			cout<<V[i];
		else if(V[i]==10)
			cout<<"A";
		else if(V[i]==11)
			cout<<"B";
		else if(V[i]==12)
			cout<<"C";
		else if(V[i]==13)
			cout<<"D";
		else if(V[i]==14)
			cout<<"E";
		else if(V[i]==15)
			cout<<"F";
	}
	cout<<endl;
} 

简单测试一下:

cpp 复制代码
int main(int argc, char** argv) 
{
	int n=38;
	TenTo2(38);
	int m=100;
	TenTo8(m);
	int a=200;
	TenTo16(a);
}

没什么问题:

首先要会STL和手写进制转换,写出来函数很容易的~

五.字符串处理

  • 同样是非常吃代码基本功的题目类型
  • 建议STLcstringalgorithm头文件等自带的函数一定要学会

举例一道非常经典的基础题------说反话:即将输入的字符串倒序输出:

输入:My name is JSL

输出:Jsl is name My

对于新手的难点大致如下:

  1. 如何键入目标字符串?
  2. 如何逆转顺序

这里博主将输入的string断开直接保存在string型的vector中,然后图省事直接调用STL的reverse逆转一下即可~

cpp 复制代码
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main(){
	vector<string> V;
	string s;
	char c;
	while ((cin >> s).get(c))
	{
		V.push_back(s);
		if (c =='\n')
			break;
	}
	cout << "输入结束~" << endl;
	reverse(V.begin(),V.end());
	for(int i=0;i<=V.size()-1;i++)
		cout<<V[i]<<" "; 
	return 0;
}

总的来说,说什么就做什么 的模拟题大致上没什么难度,只要熟练使用STL几乎不会有卡壳的地方:STL中最重要的就是vector和string容器,以及algorithm中的sort、reverse、reserve,上述几者配合结构体能达到非常出类拔萃的效果~

相关推荐
今天好像不上班5 分钟前
软件验证与确认实验二-单元测试
测试工具·算法
冷静 包容30 分钟前
C语言学习之 没有重复项数字的全排列
c语言·开发语言·学习
wclass-zhengge1 小时前
数据结构篇(绪论)
java·数据结构·算法
何事驚慌1 小时前
2024/10/5 数据结构打卡
java·数据结构·算法
结衣结衣.1 小时前
C++ 类和对象的初步介绍
java·开发语言·数据结构·c++·笔记·学习·算法
学习使我变快乐1 小时前
C++:静态成员
开发语言·c++
心怀花木1 小时前
【C++】多态
c++·多态
风清扬_jd1 小时前
Chromium 添加书签功能浅析c++
c++·chrome
吃椰子不吐壳1 小时前
c++类与对象二
c++
ROBIN__dyc1 小时前
C语言基本概念
c语言·开发语言