• 常用代码模板1——基础语法


    常用语法

    代码框架

    1. #include
    2. using namespace std;
    3. const int N = 1e5+5;
    4. int n, a[N];
    5. int main(){
    6. freopen("xxxx.in", "r", stdin);
    7. freopen("xxxx.out", "w", stdout);
    8. ios::sync_with_stdio(0); // 加快读入(也可以用 scanf/printf)
    9. // 个人编写的常规代码
    10. return 0;
    11. }

    Copy

    常用函数

    1. // 求最大/小值、绝对值
    2. double a, b;
    3. int t = max(a, b);
    4. int t = min(a, b);
    5. int t = abs(a);
    6. // 浮点数向上向下取整、四舍五入取整
    7. int t = ceil(a);
    8. int t = floor(a);
    9. int t = round(a);
    10. // 开根号和幂次
    11. double t = sqrt(a);
    12. double t = pow(x, y); // x^y

    Copy

    格式控制

    1. // 保留小数位(这里是2位)
    2. double a;
    3. cout << fixed << setprecision(2) << a;
    4. print("%.2f", a);
    5. // 位宽(CSP不考)
    6. int a;
    7. cout << setw(3) << a;

    Copy

    数据类型、溢出与转换

    1. // int 的最大最小值
    2. INT_MAX = 2147483647; // 2^31 - 1, 约为 2e9;
    3. INT_MIN = -2147483648; // -2^31
    4. // long long 的最大最小值
    5. LLONG_MAX = 9223372036854775807; // 2^63-1, 约为 9e18
    6. LLONG_MIN = -9223372036854775808; // -2^63
    7. // float 精度: 6~7位
    8. // double 精度: 15~16位
    9. // 避免精度损失:1、使用 double 2、转整数运算
    10. // 数字转字符: 'A'(65) 'a'(97) '0'(48)
    11. char A = char(65);
    12. char a = char(97);
    13. char c = 'a' + 2; // 'c' = 'a' + 2
    14. char seven = '0' + 7; // '7' = '0' + 7
    15. // 字符转数字
    16. int a = 'a'; // a: 97
    17. int A = 'A'; // A:65
    18. int t = 't' - 'a'; // 计算字母间差值
    19. int seven = '7' - '0';

    Copy

    数字处理

    数位分离与反转

    数位分离

    1. int a;
    2. cin >> a;
    3. int ge = a % 10;
    4. int shi = a /10 % 10;
    5. int bai = a / 100 % 10;
    6. ......
    7. while(a) {
    8. int x = a % 10; // 当前位(从低到高)
    9. a /= 10;
    10. }

    Copy

    判断回文数

    1. // 判断回文
    2. bool hw(int x) {
    3. int t = x, s = 0;
    4. while(t) {
    5. s = s * 10 + t % 10;
    6. t /= 10;
    7. }
    8. return s == x;
    9. }

    Copy

    日期相关

    1. // 判断闰年
    2. int year;
    3. if(year%4==0&&year%100!=0 || year%400==0) cout << "leap year";
    4. // 天数计算
    5. int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
    6. // 如何求两个日期之间的天数之差?

    Copy

    字符串操作

    字符串函数

    1. // 最常用的操作
    2. str.size();//返回字符串长度
    3. str.length();//返回字符串长度
    4. str.empty();//检查 str 是否为空,为空返回 1,否则返回 0
    5. str[n];//存取 str 第 n + 1 个字符
    6. str.at(n);//存取 str 第 n + 1 个字符(如果溢出会抛出异常)
    7. // 反转
    8. reverse(str.begin(), str.end());
    9. // 查找
    10. str.find("ab");//返回字符串 ab 在 str 的位置
    11. str.find("ab", 2);//在 str[2]~str[n-1] 范围内查找并返回字符串 ab 在 str 的位置
    12. str.rfind("ab", 2);//在 str[0]~str[2] 范围内查找并返回字符串 ab 在 str 的位置
    13. if(str.find("ab")!=string::npos)
    14. { cout << "zhaodaole, xiabiao wei" << str.find("ab"); }
    15. // 子串
    16. str.substr(3); // 返回 [3] 及以后的子串
    17. str.substr(2, 4); // 返回 str[2]~str[2+(4-1)] 子串(即从[2]开始4个字符组成的字符串)
    18. str.substring(5, 10); // 返回 str[5]~str[9] 子串(不包含结尾)
    19. // 插入
    20. str.insert(2, "sz");//从 [2] 位置开始添加字符串 "sz",并返回形成的新字符串
    21. str.insert(2, "abcd", 3);//从 [2] 位置开始添加字符串 "abcd" 的前 3 个字符,并返回形成的新字符串
    22. str.insert(2, "abcd", 1, 3);//从 [2] 位置开始添加字符串 "abcd" 的前 [2]~[2+(3-1)] 个字符,并返回形成的新字符串
    23. // 删除
    24. str.erase(3);//删除 [3] 及以后的字符,并返回新字符串
    25. str.erase(3, 5);//删除从 [3] 开始的 5 个字符,并返回新字符串
    26. // 替换
    27. str.replace(2, 4, "sz");//返回把 [2]~[2+(4-1)] 的内容替换为 "sz" 后的新字符串
    28. str.replace(2, 4, "abcd", 3);//返回把 [2]~[2+(4-1)] 的内容替换为 "abcd" 的前3个字符后的新字符串
    29. // 追加
    30. str = str + "abc";
    31. str.push_back('a');//在 str 末尾添加字符'a'
    32. str.append("abc");//在 str 末尾添加字符串"abc"

    Copy

    字符串回文

    1. // 方法一、反转再判断(常数较大)
    2. string s;
    3. cin >> s;
    4. string b = s;
    5. reverse(b.begin(), b.end());
    6. if(s == b) cout << "yes";
    7. // 方法二、原地判断
    8. for(int i = 0, j = s.size() - 1; i < j; i++, j--) {
    9. if(s[i] != s[j]) {
    10. cout << "no";
    11. return 0;
    12. }
    13. }
    14. cout << "yes";

    Copy

    二维字符数组 & 方向数组

    1. char a[N][N];
    2. // 方向数组:左、右、上、下
    3. int dx[4] = {0, 0, -1, 1};
    4. int dy[4] = {-1, 1, 0, 0};

    Copy

    STL 函数

    standard template library,锦上添花、如虎添翼的工具

    1. sort();
    2. reverse();
    3. unique();
    4. lower_bound();
    5. upper_bound();
    6. *max_element();
    7. *min_element();

    Copy

    数组遍历类

    连续性

    1. // 连续最长相同、最长上升或下降: 相邻两项比较,并讨论即可
    2. int a[N], s = 0;
    3. int ans = 0;
    4. for(int i = 1; i <= n; i++) {
    5. if(a[i] == a[i-1]) { // a[i] < a[i-1] 或 a[i] > a[i-1]
    6. s++;
    7. ans = max(ans, s);
    8. } else {
    9. s = 1;
    10. }
    11. }
    12. cout << ans;

    Copy

    双指针

    双指针是一种思想,一种技巧或一种方法,并不是什么特别具体的算法,在二分查找等算法中经常用到这个技巧。具体就是用两个变量动态存储两个或多个结点,来方便我们进行一些操作。通常用在线性的数据结构(数组、链表、队列等)中。

    判断字符串回文就是一种最简单的双指针

    1. // 方法二、原地判断
    2. for(int i = 0, j = s.size() - 1; i < j; i++, j--) {
    3. if(s[i] != s[j]) {
    4. cout << "no";
    5. return 0;
    6. }
    7. }
    8. cout << "yes";

    Copy

    股票买卖 I - TopsCoding

    1. int n, a[N];
    2. cin >> n;
    3. for (int i = 1; i <= n; i++) cin >> a[i];
    4. int minv = a[1], ans = 0;
    5. for (int i = 2; i <= n; i++) {
    6. minv = min(minv, a[i]);
    7. ans = max(ans, a[i] - minv);
    8. }
    9. cout << ans;

    Copy

    归并数组 - TopsCoding

    1. cin >> m;
    2. for(int i=1; i <= m; i++) cin >> a[i];
    3. cin >> n;
    4. for(int i=1; i <= n; i++) cin >> b[i];
    5. int pa = 1, pb = 1;
    6. while(pa<=m && pb<=n) {
    7. if(a[pa]<=b[pb]) cout << a[pa++] << ' ';
    8. else cout << b[pb++] << ' ';
    9. }
    10. while(pa <= m) cout << a[pa++] << ' ';
    11. while(pb <= n) cout << b[pb++] << ' ';

    Copy

    数组元素的目标和 - TopsCoding

    1. cin >> n >> m >> k;
    2. for (int i = 0; i < n; i ++ ) cin >> a[i];
    3. for (int i = 0; i < m; i ++ ) cin >> b[i];
    4. // i从 0开始 从前往后遍历
    5. // j从 m - 1开始 从后向前遍历
    6. for (int i = 0, j = m - 1; i < n; i ++) {
    7. // 当和大于 k 时,意味着 b[j] 不会有能和它匹配的 a[i],所以 j 左移
    8. // 不将 i 后移,因为后移后的和仍旧大于 k
    9. while(j >= 0 && a[i] + b[j] > k) j --;
    10. if(j >= 0 && a[i] + b[j] == k) printf("%d %d\n", i, j);
    11. }

    Copy

    双指针练习题

    1. 统计回文子串 - TopsCoding
    2. 归并数组 - TopsCoding
    3. 判断子序列 - TopsCoding
    4. 数组元素的目标和 - TopsCoding
    5. 感应门 - TopsCoding
    6. 游戏闯关 - TopsCoding

    数组标记类

    数组标记是指 用数组去存储问题中的输入数据或者中间数据,比如计数、判断有无,本质上是用空间换时间,最常见的好处就是降低代码的时间复杂度,不容易出现超时问题。

    常用在:

    1. 桶排序、桶计数
    2. 状态标记
    3. dfs()/bfs()中标记选择或状态
    1. // 标记数组
    2. int flag[N]; // flag[i] 用于标记状态或者计数
    3. flag[i] = 1; // 数组标记状态,选择 / 不选择

    Copy

    往年真题:直播获奖(live) - TopsCoding

    函数定义

    如果一个函数不是 void 类型,一定要保证在任何情况下都有返回值,否则可能爆零(尤其是dfs中)!!!

    1. void/int hanshu(int a, int b, ...)
    2. {
    3. ......
    4. return ...;
    5. }

    Copy

    递归

    递归有两个显著的特征,终止条件和自身调用:

    • 自身调用:原问题可以分解为子问题,子问题和原问题的求解方法是一致的,即都是调用自身的同一个函数。
    • 终止条件:递归必须有一个终止的条件,即不能无限循环地调用本身。
    1. void/int digui(......)
    2. {
    3. if(......) { // 终止条件
    4. ......
    5. return ...;
    6. }
    7. ......
    8. digui(......); // 缩小问题规模,调用自身
    9. return ...;
    10. }

    Copy

    位运算符的应用*

    1. // 判断奇数
    2. if(t & 1) {
    3. cout << "是奇数";
    4. }
    5. // 乘2、除2、2 的整数幂次
    6. int t = x << 1; // t = x * 2
    7. int t = x >> 1; // t = x / 2
    8. int t = 1 << x; // t = 2 ^ x = pow(2, x)
    9. // 判断一个非负整数是不是2的幂,注意运算符优先级
    10. if((x&(x-1))==0) cout<<"yes"<
    11. /********以下不是重点*********/
    12. // 交换两个数(实际效率并没有临时变量法高)
    13. a = a ^ b;
    14. b = a ^ b;
    15. a = a ^ b;
    16. // 取int型变量a的第k位
    17. int t = a >> k & 1;
    18. // 求两个变量的平均值(不会溢出)
    19. int ave = (x&y)+((x^y)>>1);
    20. // 求相反数 -x
    21. int t = (~x+1);
    22. // 判断x的n位(二进制中)是否为1
    23. if(x&(1<"yes"<
    24. // 将x的n位(二进制中)清0
    25. x=x&~(1<

    Copy

    往年真题

  • 相关阅读:
    Mybatis-plus 自动生成代码
    刷题记录:牛客NC22598Rinne Loves Edges
    JS for...in 和 for...of 的区别?
    vue3-element-plus使用
    充分复用离线空闲算力,降低了实时计算资源开支
    @JsonView注解的简单使用
    vue解决报错Unable to preventDefault inside passive event listener invocation.
    ENVI IDL:MODIS SWATH产品的点位-像元提取(另附Python代码)
    搞笑段子很皮的文案系列001,可爱有趣文案系列合集
    软件测试/测试开发丨Postman实战练习 学习笔记
  • 原文地址:https://blog.csdn.net/WANGHAOXIN364/article/details/126153483