OJ常用函数/机试常用STL模板

目录

  • 机试涉及到的算法
  • 一、字符串
  • 二、vector
  • 二、map
  • 三、set
  • 四、queue
  • 五、并查集
  • 五、cmath
  • 六、读入数据
    • 6.1 示例1
    • 6.2 示例2
    • 6.3 示例3
    • 6.4 示例4
    • 6.5 示例5
    • 6.6 示例6
    • 6.7 示例7
    • 6.8 示例8
    • 6.9 示例9
    • 6.10 示例10
    • 6.11 示例11
  • 七、输入输出
  • 八、排序
  • 九、数学相关
  • 十、大数的表示
  • 十一、IDE

机试涉及到的算法

排序算法,BFS,DFS,回溯法,打表法,双指针算法,贪心算法(背包问题、活动安排问题),动态规划(最大连续子序列和、LIS、LCS等等),压缩路径的并查集问题,dijkstra算法(最短路径),kruskal算法(最小生成树),树的前序中序后序转换及还原,二分图及图的着色问题,快速幂和快速乘算法,大整数/高精度运算,STL的运用(如vector、string、stack、queue的常见操作)

一、字符串

  1. 判断字符串中是否包含字符串
#include <iostream>
#include <string>
using  namespace  std;
int  main()
{
     string a= "abcdefghigklmn" ;
     string b= "def" ;
     string c= "123" ;
     string::size_type idx;
     
     idx=a.find(b); //在a中查找b.
     if (idx == string::npos) //不存在。
         cout <<  "not found\n" ;
     else //存在。
         cout << "found\n" ; 
     idx=a.find(c); //在a中查找c。
     if (idx == string::npos ) //不存在。
         cout <<  "not found\n" ;
     else //存在。
         cout << "found\n" ; 
     return  0;
}
  1. int 转 string
int val = 15;
// 使用 std 命名空间内的方法
string str = to_string(val);
  1. string 转 int
string str = "15";
// 转换为C字符串,然后利用 C 提供的函数 atoi 转换为 int 类型
int val = atoi(str.c_str())
  1. 在指定位置插入字符
string str = "abc";
int pos = 2;
// 在指定位置插入字符
str.insert(str.begin() + pos, 'd');
cout<<str<<endl; // 输出:abdc
  1. 在指定位置插入字符串
string str = "abc";
int pos = 2;
// 在指定位置插入字符串
str.insert(2, "de");
cout<<str<<endl; // 输出:abdec

二、vector

  1. 指定位置插入元素
#include <vector>
#include <iostream>
using namespace std;

int main()
{
    vector<int> digits = {1, 2, 3};
    for (int i = 0; i < digits.size(); i++)
    {
        cout << digits[i] << " ";
    }
    cout << endl;
    int pos = 1;
    digits.insert(digits.cbegin() + pos, 0);
    // digits = {1, 0, 2, 3}
    for (int i = 0; i < digits.size(); i++)
    {
        cout << digits[i] << " ";
    }
    return 0;
}

二、map

  1. 查找元素
// 判断 mp 中是否存在 key
if (mp.find(key) == mp.end()) {
    return -1;
}
  1. 插入/修改元素(关于通过下标访问map(或unordered_map)中不存在的元素,对容器的影响,可以参考:https://blog.csdn.net/myf_666/article/details/132192002)
// 更新哈希表
mp[key] = cur;
  1. 删除元素
mp.erase(key);
  1. 对于map和unordered_map,当我们采用下标运算符访问不存在的key值时,会先插入一个value(调用默认构造函数),然后返回。这样就会对原有变量造成破坏。如果我们不想拥有这种访问map或unordered_map导致的副作用,我们可以使用find操作,该操作不会对原有变量造成破坏。

三、set

  1. 添加元素
srcNames.insert(srcName);
srcNames.emplace(srcName); // 效率比insert更高一些

在这里插入图片描述

  1. 查找元素
opNames.find("*") == opNames.end()
  1. 合并两个集合
#include<algorithm>
set_union(roleSets.begin(), roleSets.end(),
	tmp.begin(), tmp.end(), 
	inserter(roleSets, roleSets.begin()));

四、queue

  1. 优先队列,默认是大根堆:
    priority_queue<int> girlsLike;
    priority_queue<int> boysLike;
  1. 如果想使用小根堆,在模板中添加参数,greater表示后面的元素要大于前面的:
    priority_queue<int, vector<int>, greater<int>> girlsLike;
    priority_queue<int, vector<int>, greater<int>> boysLike;

在使用小根堆来实例化自定义类型时,需要注意重载运算符>,重载<运算符会报错。示例代码如下:

struct Point
{
    int val;
    int x;
    int y;
    Point(int val, int x, int y) : val(val), x(x), y(y) {}
    // 重载>运算符,同时函数末尾注意添加const
    bool operator>(const Point &point) const
    {
        return this->val > point.val;
    }
};

greater是一个模板,关于这个模板的介绍可以参考:C++中的 greate/less 比较器模板的实现原理及作用:https://blog.csdn.net/myf_666/article/details/135374270

五、并查集

不带有路径压缩的并查集:

class UFSets {
public:
    vector<int> vec;

    UFSets(int sz) {
        vec = vector<int>(sz, -1);
    }
    int Find(int x) {
        while (vec[x] >= 0)x = vec[x];
        return x;
    }
    bool Union(int root1, int root2) {
        int r1 = Find(root1);
        int r2 = Find(root2);
        if (r1 == r2) {
            return false;
        }
        if (vec[r2] < vec[r1]) {
            vec[r2] = vec[r1] + vec[r2];
            vec[r1] = r2;
        }
        else {
            vec[r1] = vec[r1] + vec[r2];
            vec[r2] = r1;
        }
        return true;
    }
};

带有路径压缩的并查集:

// 加权并查集
class UFSets {
public:
    vector<int> parent;

    UFSets(int n) {
        parent = vector<int>(n);
        for (int i = 0; i < n; i++) {
            parent[i] = i;
        }
    }

    int Find(int x) {
        if (x != parent[x]) {
        	// 递归进行路径压缩
            parent[x] = Find(parent[x]);
        }
        return parent[x];
    }

    void Union(int x, int y) {
        int rootX = Find(x);
        int rootY = Find(y);
        if (rootX == rootY) {
            return;
        }
        parent[rootX] = rootY;
    }
};

五、cmath

#include<cmath>

里面角度的大小均为弧度制,如果是角度,需要进行转换 θ ∗ P I / 180 \theta*PI/180 θPI/180

#define PI acos(-1.0)

函数相关功能如下:

在这里插入图片描述

六、读入数据

6.1 示例1

输入描述:
输入包括两个正整数a,b(1 <= a, b <= 1000),输入数据包括多组。

输出描述:
输出a+b的结果

输入例子:
1 5
10 20

输出例子:
6
30

代码:

#include <iostream>
using namespace std;

int main() {
    int a, b;
    while (cin >> a >> b) { // 注意 while 处理多个 case
        cout << a + b << endl;
    }
}
// 64 位输出请用 printf("%lld")

6.2 示例2

输入描述:
输入第一行包括一个数据组数t(1 <= t <= 100)
接下来每行包括两个正整数a,b(1 <= a, b <= 1000)

输出描述:
输出a+b的结果

输入例子:
2
1 5
10 20

输出例子:
6
30

#include <iostream>
using namespace std;

int main() {
    int a, b;
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> a >> b;
        cout << a + b << endl;
    }
}
// 64 位输出请用 printf("%lld")

6.3 示例3

输入描述:
输入包括两个正整数 a , b ( 1 < = a , b < = 1 0 9 ) a,b(1 <= a, b <= 10^9) a,b(1<=a,b<=109),输入数据有多组, 如果输入为0 0则结束输入

输入例子:
1 5
10 20
0 0

输出例子:
6
30

#include <iostream>
using namespace std;

int main() {
    int a, b;
    while (true) {
        cin >> a >> b;
        if (a == 0 && b == 0) {
            break;
        }
        cout << a + b << endl;
    }
}
// 64 位输出请用 printf("%lld")

6.4 示例4

输入描述:
输入数据包括多组。
每组数据一行,每行的第一个整数为整数的个数n(1 <= n <= 100), n为0的时候结束输入。
接下来n个正整数,即需要求和的每个正整数。

输出描述:
每组数据输出求和的结果

输入例子:
4 1 2 3 4
5 1 2 3 4 5
0

输出例子:
10
15

#include <iostream>
using namespace std;

int main() {
    int a, b;
    while (true) { // 注意 while 处理多个 case
        int n;
        cin >> n;
        if (n == 0)break;
        int sum = 0;
        for (int i = 0; i < n; i++) {
            int tmp;
            cin >> tmp;
            sum += tmp;
        }
        cout << sum << endl;
    }
}
// 64 位输出请用 printf("%lld")

6.5 示例5

输入描述:
输入的第一行包括一个正整数t(1 <= t <= 100), 表示数据组数。
接下来t行, 每行一组数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。

输出描述:
每组数据输出求和的结果

输入例子:
2
4 1 2 3 4
5 1 2 3 4 5

输出例子:
10
15

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        int numberNum;
        cin >> numberNum;
        int sum = 0;
        for (int j = 0; j < numberNum; j++) {
            int tmp;
            cin >> tmp;
            sum += tmp;
        }
        cout << sum << endl;
    }
}
// 64 位输出请用 printf("%lld")

6.6 示例6

输入描述:
输入数据有多组, 每行表示一组输入数据。
每行的第一个整数为整数的个数n(1 <= n <= 100)。
接下来n个正整数, 即需要求和的每个正整数。

输出描述:
每组数据输出求和的结果

输入例子:
4 1 2 3 4
5 1 2 3 4 5

输出例子:
10
15

#include <iostream>
using namespace std;

int main() {
    int n;
    while (cin >> n) {
        int sum = 0;
        for (int i = 0; i < n; i++) {
            int tmp;
            cin >> tmp;
            sum += tmp;
        }
        cout << sum << endl;
    }
}
// 64 位输出请用 printf("%lld")

6.7 示例7

输入描述:
输入数据有多组, 每行表示一组输入数据。
每行不定有n个整数,空格隔开。(1 <= n <= 100)。

输出描述:
每组数据输出求和的结果

输入例子:
1 2 3
4 5
0 0 0 0 0

输出例子:
6
9
0

#include <iostream>
using namespace std;

int main() {
    int tmp;
    int sum = 0;
    while (cin >> tmp) {
        sum += tmp;
        if (cin.get() == '\n') {
            cout << sum << endl;
            sum = 0;
        }
    }
}
// 64 位输出请用 printf("%lld")

6.8 示例8

输入描述:
输入有两行,第一行n
第二行是n个字符串,字符串之间用空格隔开

输出描述:
输出一行排序后的字符串,空格隔开,无结尾空格

输入例子:
5
c d a bb e

输出例子:
a bb c d e

#include <iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;

int main() {
    string str;
    int n;
    cin >> n;
    vector<string> vec;
    for (int i = 0; i < n; i++) {
        cin >> str;
        vec.push_back(str);
    }

    sort(vec.begin(), vec.end());
    for (int i = 0; i < vec.size(); i++) {
        cout << vec[i] << " ";
    }
}
// 64 位输出请用 printf("%lld")

6.9 示例9

输入描述:
多个测试用例,每个测试用例一行。
每行通过空格隔开,有n个字符,n<100

输出描述:
对于每组测试用例,输出一行排序过的字符串,每个字符串通过空格隔开

输入例子:
a c bb
f dddd
nowcoder

输出例子:
a bb c
dddd f
nowcoder

#include <iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;

int main() {
    string str;

    vector<string> vec;

    while (cin >> str) {
        vec.push_back(str);
        if (cin.get() == '\n') {
            sort(vec.begin(), vec.end());
            for (int i = 0; i < vec.size(); i++) {
                cout << vec[i] << " ";
            }
            cout << endl;
            vec.clear();
        }
    }

}

6.10 示例10

输入描述:
多个测试用例,每个测试用例一行。
每行通过,隔开,有n个字符,n<100

输出描述:
对于每组用例输出一行排序后的字符串,用’,'隔开,无结尾空格

输入例子:
a,c,bb
f,dddd
nowcoder

输出例子:
a,bb,c
dddd,f
nowcoder

#include <iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;

int main() {
    string str;

    vector<string> vec;
    while (cin >> str) {
        string cur;
        for (int i = 0; i < str.size(); i++) {
            while (str[i] != ',' && i < str.size()) {
                cur += str[i];
                i++;
            }
            vec.push_back(cur);
            cur = "";
        }
        sort(vec.begin(), vec.end());
        for (int i = 0; i < vec.size(); i++) {
            if (i == vec.size() - 1) {
                cout << vec[i] << endl;
            } else {
                cout << vec[i] << ",";
            }
        }
        vec.clear();
    }

}

6.11 示例11

数据范围:
0 < a , b < 2 × 1 0 10 0<a,b<2×10^{10} 0<a,b<2×1010

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M

输入描述:
输入有多组测试用例,每组空格隔开两个整数

输出描述:
对于每组数据输出一行两个整数的和

输入例子:
1 1
输出例子:
2

#include <iostream>
using namespace std;

int main() {
    long a, b; // 不要用 int a, b, 因为测试数据会越界,为了效果,所以这个题目故意不在题面说数据范围
    while (cin >> a >> b) { // 注意 while 处理多个 case
        cout << a + b << endl;
    }
}
// 64 位输出请用 printf("%lld")

七、输入输出

  1. 控制输出位数:
#include <iomanip>
using namespace std;

int main(){
	double result = 3.1415926;
	std::cout << fixed << setprecision(3) << result << std::endl;
}
  1. 关掉缓冲区同步,提高输入输出效率
	//提高cin,cout的速度 
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  1. endl 替换为 \n 可以提高效率。因为在插入换行符的同时,endl还会刷新缓冲区,使得输出字符立即显示到屏幕上,这一操作会造成较为昂贵的开销。在输入数据较小的情况下,区别不大,但如果需要大量输出换行的题目,时间提升很明显。

八、排序

  1. 排序主要利用sort函数,默认从小到大排
	vector<int> A(M, 0);
	for (int i = 0; i < M; i++) {		 // 朋友近视眼度数
		cin >> A[i];
	}
	sort(A.begin(), A.end()); // 从小到大
  1. 排序map,并自定义排序规则
	vector<pair<int,int>> HP(N);
	for (int i = 0; i < N; i++) { // 高度
		cin >> HP[i].first;
	}

	for (int i = 0; i < N; i++) { // 位置
		cin >> HP[i].second;
	}

	sort(HP.begin(), HP.end(), [&](pair<int, int> a, pair<int, int> b) {
		return a.second < b.second;
		});
  1. 从大到小排
	vector<int> A(M, 0);
	for (int i = 0; i < M; i++) {		 // 朋友近视眼度数
		cin >> A[i];
	}
	sort(A.begin(), A.end(), greater<int>()); // 从大到小,用greater<int>()

九、数学相关

  1. PI如何定义

通过下面这种反函数,来定义宏进行实现。

# define PI acos(-1)

十、大数的表示

在设置一些无限大的参数时,我们往往纠结于要设置多大。具体选择这两个数的原因参见博客:https://blog.csdn.net/tigercoder/article/details/70338623 和 https://blog.csdn.net/u010129448/article/details/37941123

int minVal = 0x3f3f3f3f;
int maxVal = -0x3f3f3f3f - 1;

或者,当所有情况的值都大于0,而且我们想要保存某个最大值的时候:

int maxVal = 0;

因为不会出现负数的情况嘛,所以没有必要考虑无穷小。

十一、IDE

VS2012中需要使用下面代码来停住窗口,查看结果。

system("pause");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/336353.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决git错误:error: failed to push some refs to ‘git xxx xxxx‘

目录 第一章、问题分析1.1&#xff09;报错提示1.2&#xff09;报错分析 第二章、解决方式2.1&#xff09;方式1&#xff1a;直接pull2.2&#xff09;方式2&#xff1a;直接pull2.3&#xff09;方式三 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点…

Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin(二)

Android Matrix绘制PaintDrawable设置BitmapShader&#xff0c;手指触点为圆心scale放大原图&#xff0c;Kotlin&#xff08;二&#xff09; 在 Android Matrix绘制PaintDrawable设置BitmapShader&#xff0c;手指触点为圆心scale放大原图&#xff0c;Kotlin-CSDN博客 基础上&…

ZYNQ 调用AXI WR RD ip及其代码

首先调用ip 值得注意的是&#xff1a;zynq支持axi4.0 &#xff0c;但是创建的ip是属于axi3.0&#xff0c;其区别主要是在数据位宽以及突发长度的区别。 下面附读写控制模块&#xff08;稍作修改就可使用&#xff0c;数据位宽是64bit 突发长度是256&#xff09;&#xff1a; as…

C语言从入门到实战——编译和链接

编译和链接 前言一、 翻译环境和运行环境二、 翻译环境2.1 预处理&#xff08;预编译&#xff09;2.2 编译2.2.1 词法分析2.2.2 语法分析2.2.3 语义分析 2.3 汇编2.4 链接 三、 运行环境 前言 在C语言中&#xff0c;编译和链接是将源代码转换为可执行文件的两个主要步骤。 编…

【Linux】信号量基于环形队列的生产消费模型

信号量 信号量的本质是一个计数器&#xff0c;可以用来衡量临界资源中资源数量多少 信号量的PV操作 P操作&#xff1a;申请信号量称为P操作&#xff0c;P操作的本质就是让计数器减1。 V操作&#xff1a;释放信号量称为V操作&#xff0c;V操作的本质就是让计数器加1 POSIX信号量…

phpmyadmin 创建服务器

phpmyadmin默认的服务器是localhost 访问setup&#xff0c;创建新的服务器 添加服务器信息 点击应用&#xff0c;服务器创建成功 下载配置文件config.inc.php&#xff0c;放到WWW目录下 可再次访问setup&#xff0c;发现已配置过了 访问登录页面&#xff0c;发现可选…

x-cmd pkg | yt-dlp - 专注于 YouTube 的下载工具

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 yt-dlp 是一款强大的命令行下载工具&#xff0c;专注于下载 YouTube 视频和音频。它是 youtube-dl 的一个改进和拓展版本&#xff0c;提供了更多功能和修复了一些问题。 yt-dlp 具有灵活的支持&#xff0c;可下载 Yo…

用Jmeter进行性能测试

项目背景 我们的平台为全国某行业监控平台&#xff0c;经过3轮功能测试、接口测试后&#xff0c;98%的问题已经关闭&#xff0c;决定对省平台向全国平台上传数据的接口进行性能测试。01测试步骤1、编写性能测试方案 由于我是刚进入此项目组不久&#xff0c;只参与了其中3个模块…

HTTP 协议和 TCP/IP 协议之间有什么区别?

HTTP&#xff08;超文本传输协议&#xff09;和TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;是两种在互联网通信中广泛使用的协议&#xff0c;它们之间的区别和联系对许多人来说可能还不是很清晰&#xff0c;今天我们就带大家来一起了解一下HTTP和TCP/IP协议这2者之…

用C语言实现简单的三子棋游戏

目录 1 -> 模块简介 2 -> test.c 3 -> game.c 4 -> game.h 1 -> 模块简介 test.c:测试游戏逻辑 game.c: 函数的实现 game.h:函数的声明 2 -> test.c #define _CRT_SECURE_NO_WARNINGS 1#include "game.h";void menu() {printf("****…

使用Element中的input组件如何实现文字和输入框在一行显示

利用 <el-form-item label"商品名称&#xff1a;">标签包裹即可&#xff0c;label写提示文字 <el-form ref"form" label-width"100px"><el-form-item label"商品名称&#xff1a;"><el-input v-model"na…

redis-exporter监控部署(k8s内)tensuns专用

reidis-exporter服务需要用到configmap、service、deployment服务 创建存放yaml目录 mkdir /opt/redis-exporter && cd /opt/redis-exporter 编辑yaml配置文件 vi configmap.yaml apiVersion: v1 kind: ConfigMap metadata:name: redis-confnamespace: monitorlab…

面试题 05.06. 整数转换(力扣)(OJ题)

题目链接&#xff1a;面试题 05.06. 整数转换 - 力扣&#xff08;LeetCode&#xff09; 所属专栏&#xff1a;刷题 整数转换。编写一个函数&#xff0c;确定需要改变几个位才能将整数A转成整数B。 示例1: 输入&#xff1a;A 29 &#xff08;或者0b11101&#xff09;, B 15…

鸿蒙 HarmonyOS ArkTS ArkUI 动画 中心缩放、顶部缩放、纵向缩放

EntryComponentstruct Index {State widthA: number 200State heightA: number 200onPageShow():void{animateTo ( {duration: 2000,iterations: -1,curve:Curve.Linear}, () > {this.widthA 0this.heightA 0} )}build() {Column() {// 中心缩放Column(){}.width(this.wi…

Python中二维数据(数组、列表)索引和切片的Bug

Python中有关数据结构索引和切片引起的Bug 一维数据索引和切片一维数组一维列表 二维数据的索引和切片二维数组二维(错误)列表 一维数据索引和切片 一维数组 对于一维数据进行索引和切片操作&#xff0c;大家都比较熟悉通过下面代码进行实现 import numpy as np data np.ra…

网络文件共享ftp

一&#xff0c;存储类型 &#xff08;一&#xff09;三种存储类型介绍 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 直连&#xff1a;硬盘加服务器 存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff08;可以使用空间&#…

vue3 + antd 封装动态表单组件(一)

前置条件&#xff1a; vue版本 v3.3.11 ant-design-vue版本 v4.1.1 创建动态组件配置文件config.js import { Input, Textarea, InputNumber, Select, RadioGroup, CheckboxGroup, DatePicker } from ant-design-vue;// 表单域组件类型 export const componentsMap {Text: …

还在手动复制文章吗?教你如何一键将文章从notion同步到WordPress

本文会给大家介绍如何在WordPress上安装一个插件&#xff0c;实现将notion上写的文章自动同步到WordPress上&#xff0c;从而提高写作效率&#xff0c;接下来请跟随我的脚步一起来操作吧&#xff01; 一、插件安装 在WordPress后台添加新插件页面中搜索“notion”&#xff0c;…

实验六 模式对象管理与安全管理

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

Matplotlib Mastery: 从基础到高级的数据可视化指南【第30篇—python:数据可视化】

文章目录 Matplotlib: 强大的数据可视化工具1. 基础1.1 安装Matplotlib1.2 创建第一个简单的图表1.3 图表的基本组件&#xff1a;标题、轴标签、图例 2. 常见图表类型2.1 折线图2.2 散点图2.3 条形图2.4 直方图 3. 图表样式与定制3.1 颜色、线型、标记的定制3.2 背景样式与颜色…