保研考研机试攻略:第一章——从零开始

🍨🍨🍨欢迎大家来到保研考研机试攻略专栏,该专栏将更新我对N诺平台的计算机考研机试攻略------高分篇、满分篇教程的学习笔记和心得,N 诺是唯一 一个纯粹为计算机考研而准备的学习平台,学完这些教程的内容,相信我们都会拿到满意的机试高分,如果你也对机试考试的准备感到迷茫,来和我一起学习吧~有任何问题欢迎评论区留言或私信我,让我们一起拿捏机试,顺利上岸!!!

目录

[🧊🧊🧊1.1 输入输出技巧](#🧊🧊🧊1.1 输入输出技巧)

🥥(1)基本类型输入输出

🥥(2)gets、getchar和putchar的使用

🥥(3)输出进制转换

🥥(4)输出增加前置0

🥥(5)输出保留小数

🥥(6)输出字符ASCII码

🥥(7)cin、cout加速

🥥(8)其他经验

计算整数n的位数

不同输入结束的处理

字符串转整数

整数转字符串

[🧊🧊🧊1.2 头文件问题](#🧊🧊🧊1.2 头文件问题)

[🧊🧊🧊1.3 时间复杂度是否可行](#🧊🧊🧊1.3 时间复杂度是否可行)

[🧊🧊🧊1.4 STL](#🧊🧊🧊1.4 STL)

🥥(1)排序sort

🥥(2)查找lower_bound&upper_bound

🥥(3)优先队列priority_queue(堆)

🥥(4)vector

🥥(5)queue

🥥(6)stack

🥥(7)map

🥥(8)set


🧊🧊🧊1.1 输入输出技巧

🥥(1)基本类型输入输出

  • 输入int型变量 scanf("%d",&i);
  • 输入long long型变量 scanf("%lld",&ll)
  • 输入double型变量 scanf("%lf",&d);
  • 输入char型变量 scanf("%c",&c);
  • 输入string型变量 scanf("%s",s);
  • 输出 printf("%d %lf %c %lld %s\n",&i,&d,&c,&ll,s);

🥥(2)gets、getchar和putchar的使用

cpp 复制代码
char s[200];
gets(s);//可输入带空格的字符,如Hello world!
printf("%s\n",s);

char c=getchar();//只能输入一个字符,可用作string间的空格的消除
putchar(c);

🥥(3)输出进制转换

cpp 复制代码
int a=10;
printf("%x\n",a);//小写十六进制输出,a
printf("%X\n",a);//大写十六进制输出,A
printf("%o\n",a);//八进制输出,12

itoa(num,string,2);//转二进制
itoa(num,string,10);//转十进制
//这个函数用的时候注意有些oj环境即使用万能头也不支持

🥥(4)输出增加前置0

cpp 复制代码
int a=1;
printf("%02d\n",a);//2表示宽度,不够补0:输出01

🥥(5)输出保留小数

cpp 复制代码
//c语言输出固定位数小数
double a=5.2;
printf("%.2lf\n",a);//输出保留两位小数:输出5.20

//c++输出固定位数小数
cout<<fixed<<setprecision(n)<<a;//保留n位小数

//四舍五入保留两位小数
double rounded=std::round(a*100)/100;

🥥(6)输出字符ASCII码

cpp 复制代码
printf("%d\n",'a');//97
printf("%d\n",'A');//65

提示:printf和cout尽量不要同时使用,会发生一些不可控的意外。但是建议在代码中c与c++语法混用,用c++提交。一般c++输入输出更方便些,建议使用。当输入输出有特殊要求时,cin和cout不好解决时,还是用scanf和printf解决方便一些。

🥥(7)cin、cout加速

cpp 复制代码
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);

🥥(8)其他经验

计算整数n的位数

cpp 复制代码
int n;
int bit=static_cast<int>(log10(n))+1;

不同输入结束的处理

cpp 复制代码
//1告诉有n组,直接for循环输入
for(int i=0;i<n;i++){}

//2以"0 0"表示输入结束
cin>>a>>b;
while(a!=0&&b!=0){//这里处理完数据记得cin>>a>>b;}

//3什么信息也不给,自己判断后方是否还有输入,但是知道一行要输入几个数
while(cin>>a>>b){}或while(scanf("%x %x",&a,&b)!=EOF){}

//4连输入一行几个数也不知道
while(getline(cin,s)){}

字符串转整数

cpp 复制代码
string s;
cin>>s;
for(int i=0;i<=length;i++)
{
    stringstream ss;
    ss<<s[i];
    ss>>n;
    num=num*10+n;
    n=0;
}

整数转字符串

cpp 复制代码
int x;
string s=to_string(x);

🧊🧊🧊1.2 头文件问题

推荐使用万能头文件:#include<bits/stdc++.h>,一般系统都支持使用。

🧊🧊🧊1.3 时间复杂度是否可行

给出一个对应关系,以时限为1s为例:

时间复杂度 N的可行大小
O(N) 500W(10^7)左右
O(NlogN) 20W(10^6)左右
O(N^2) 2000左右
O(N^2logN) 700左右
O(N^3) 200左右
O(N^4) 50左右
O(2^N) 24左右
O(N!) 10左右

**特殊技巧:**发现算法可能超时(一般是暴力),先把这道题留一下,做其他题,可以去看一下排行榜,如果过这道题的人多,说明这道题可能数据比较水,直接暴力,出题人可能偷懒或者失误了导致数据很水。考研机试的题目数据大部分情况都比较水,不要被复杂度吓唬住了,后面会教大家如何用优雅的技巧水过去不会优化的算法。

🧊🧊🧊1.4 STL

STL的函数多在algorithm头文件中,可以直接拿来用。

🥥(1)排序sort

时间复杂度O(NlogN),对容器如struct用sort需要重载小于号

cpp 复制代码
sort(begin,end+1,cmp);
//三个参数(最后一个参数可以没有)
//第一个是排序区间起点
//第二个是排序区间终点+1
//第三个是排序方法函数,默认升序,降序:greater<int>()

//n个数的数组
sort(a,a+n);

🥥(2)查找lower_bound&upper_bound

时间复杂度O(logN)

  • lower_bound(begin,end+1,num):大于等于num的第一个位置
  • upper_bound(begin,end+1,num):大于num的第一个位置

两个函数都是采用二分查找 的方法在一个排好序的数组中进行的查找

cpp 复制代码
//n个数的数组
int pos1=lower_bound(a,a+n,11)-a;
int pos2=upper_bound(a,a+n,11)-a;

两个函数返回的都是地址,不存在就返回end+1,通过返回地址减去起始地址begin得到找到数字在数组中的下标。

  • lower_bound(begin,end+1,num,greater<int>()):小于等于num的第一个位置
  • upper_bound(begin,end+1,num,greater<int>()):小于num的第一个位置

🥥(3)优先队列priority_queue(堆)

  • q.push(num)
  • q.empty()
  • q.top()
  • q.pop()
cpp 复制代码
#include <iostream>
#include <queue>
using namespace std;
int main() {
    priority_queue<int> q;//定义一个优先队列,默认大根堆,小根堆在int后加上greater<int>
    q.push(1);//入队
    q.push(2);
    q.push(3);
    while (!q.empty()) {//判读队列不为空
        cout << q.top() << endl;//队首元素
        q.pop();//出队
    }
    return 0;
}

🥥(4)vector

  • a.back()=4;
  • a.clear()
  • a.push_back(num)
  • a.pop_back(num)
  • a.resize(11):多删少补,默认补0
  • a.resize(11,5):补5
  • a.size()
  • a.empty()
cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
    vector<int> v;//定义一个空的 vector
    for (int i = 1; i <= 10; ++i) {
        v.push_back(i * i); //加入到 vector 中
    }
    for (int i = 0; i < v.size(); ++i) {
        cout << v[i] << " "; //访问 vecotr 的元素
    }
    cout << endl;
    return 0;
}

🥥(5)queue

cpp 复制代码
#include <iostream>
#include <queue>
using namespace std;
int main() {
    queue<int> q;//定义一个队列
    q.push(1);//入队
    q.push(2);
    q.push(3);
    while (!q.empty()) {//当队列不为空
        cout << q.front() << endl;//取出队首元素
        q.pop();//出队
    }
    return 0;
}

🥥(6)stack

  • s.push(num)
  • s.top()
  • s.pop()
  • s.empty()
  • s.size()
cpp 复制代码
#include <iostream>
#include <stack>
using namespace std;
stack<int> S;//定义一个栈
int main() {
    S.push(1);//入栈
    S.push(10);
    S.push(7);
    while (!S.empty()) {//当栈不为空
        cout << S.top() << endl;//输出栈顶元素
        S.pop();//出栈
    }
    return 0;
}

🥥(7)map

<key,value>键值对结构

  • map<int,bool> mp;
  • mp[13]=true;
  • mp.find(13)!=mp.end();
  • mp.count(12);
  • mp.erase(12);
  • mp.clear();
cpp 复制代码
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main() {
    map<string, int> dict;//定义一个 map
    dict["Tom"] = 1;//定义映射关系
    dict["Jone"] = 2;
    dict["Mary"] = 1;
    if (dict.count("Mary")) {//查找 map
        cout << "Mary is in class " << dict["Mary"];
    }
    //使用迭代器遍历 map 的 key 和 value
    for (map<string, int>::iterator it = dict.begin(); it != dict.end(); ++it) {
        cout << it->first << " is in class " << it->second << endl;
    }
    dict.clear();//清空 map
    return 0;
}

🥥(8)set

默认升序排列,且去重

  • s.insert(3);
  • s.erase(3);
  • auto it1=s.find(4),it2=s.find(6);
  • if(it1==s.end()) cout<<"no";
  • s.count(1);
cpp 复制代码
#include <iostream>
#include <set>
using namespace std;
int main() {
    set<string> country;//定义一个存放 string 的集合
    country.insert("China");//插入操作
    country.insert("America");
    country.insert("France");
    set<string>::iterator it;
    //使用迭代器遍历集合元素
    for (it = country.begin(); it != country.end(); ++it) {
        cout << * it << " ";
    }
    cout << endl;
    country.erase("American");//删除集合内的元素
    country.erase("England");
    if (country.count("China")) {//统计元素个数
        cout << "China in country." << endl;
    }
    country.clear();//清空集合
    return 0;
}

创作不易,点个赞吧~点赞收藏不迷路,感兴趣的宝子们欢迎关注该专栏~

相关推荐
UestcXiye1 小时前
《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列
c++·计算机网络·ip·tcp
亦枫Leonlew1 小时前
三维测量与建模笔记 - 3.3 张正友标定法
笔记·相机标定·三维重建·张正友标定法
幼儿园老大*1 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
考试宝1 小时前
国家宠物美容师职业技能等级评价(高级)理论考试题
经验分享·笔记·职场和发展·学习方法·业界资讯·宠物
好奇龙猫2 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
霁月风2 小时前
设计模式——适配器模式
c++·适配器模式
sp_fyf_20242 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
ChoSeitaku3 小时前
链表交集相关算法题|AB链表公共元素生成链表C|AB链表交集存放于A|连续子序列|相交链表求交点位置(C)
数据结构·考研·链表
偷心编程3 小时前
双向链表专题
数据结构
香菜大丸3 小时前
链表的归并排序
数据结构·算法·链表