C++算法基础语法注意点(自用) - acwing

C++算法基础语法

1.1 变量、输入输出、表达式和顺序语句

  • #include <iostream>:包含cin、cout、endl输入输出函数

    #include <cstdio>:包含scanf、print输入输出函数

    scanf效率比cin效率高,cin/cout可以转换成scanf/print,反之不一定

    cin读入char时可以过滤空格,但scanf不会

  • 类型细节字节byte
    布尔型boolfalse/true,输入为%d1
    int-2147483648 ~ 2147483647(-231~231-1)4
    单精度浮点数float可以表示科学计数法1.2e3 = 1200,6-7位有效数字4
    double15-16位有效数字8
    long long-263 ~ 263-18
    long double18-19位有效数字
  • 取模时结果取决于前面数的符号,和数学中的取余不一样,做题时注意

    cout << 5 % 2 << endl;	// 1
    cout << -5 % 2 << endl;	//-1
    
  • 赋值时++在前才有实际效果

    int b = c = 2;
    c = 3;
    int q = ++b, p = c++;
    cout << b << ' ' << q << endl; 	// 2 3
    cout << c << ' ' << p << endl;	// 3 3
    
  • 隐形类型转换,当两个精度不同的值运算,运算结果默认为精度较高的类型

    eg:int + char -> char

  • 运用头文件<iomanip>的函数fixed<<setprecision(保留位数)设置输出的小数点位数,具体格式为:cout << fixed << setprecision(n) << 变量 <<endl;

  • 运用头文件<cmath>的函数sqrt()计算根号,利用函数pow(x,n)计算xn

  • 604. 圆的面积 - AcWing题库
    在这里插入图片描述

  • (4/3) 无法得到 1.3333…,需要使用 (4/3.0)

  • %要求两个操作数均为整数或可以隐式转换成整数的类型

  • 656. 钞票和硬币 - AcWing题库
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

1.2 判断语句

  • printf("%5d"):表示输出五位整数,不足的在左边补上空格;如果是-5,则在右边补上空格

    printf("%05d"):表示输出五位整数,不足的在左边补上0

    浮点数同理,在小数点前写

  • printf(“%%”):表示输出%

1.3 循环结构

1.4 数组

1.5 字符串

  • ASCII中48-57是0-9,65-90是A-Z,97是a,32是空格

  • 可以使用字符串来初始化字符数组,但此时要注意,每个字符串结尾会暗含一个’\0’字符,因此字符数组的长度至少要比字符串的长度多1。
    在这里插入图片描述

  • 输入输出
    在这里插入图片描述

    scanfcin都是遇到回车或者空格停止

    fgets(str, 最大读入量, stdin):输入一行字符串,包括空格,其中str为字符数组

    getline(cin, s):输入一行字符串,包括空格,其中s为字符串

  • 字符数组常用操作——引入<string.h>

    strlin(str):求字符串的长度

    strcmp(a, b):比较a、b的字典序,如果a>b返回1,a=b返回0,a<b返回-1

    strcpy(a, b):把b复制给a

    其实这三个函数等同于循环,在for中作为判断条件时可以赋值出来。

  • 字符串的定义
    在这里插入图片描述

  • 字符串的输入输出

    string s1, s2;
    cin >> s1 >> s2;
    cout << s1 << ' ' << endl;
    // scanf("%s", &s1) 不成立
    printf("%s", s1.c_str);
    puts(s1.c_str);
    
  • 区分cin.getline(s, n)getline(cin, s)

    // 
    char m[20];
    cin.getline(m,5);	
    // 输入:jkljkljkl 输出:jklj  接收5个字符到m中,其中最后一个为'\0',所以只看到4个字符输出;
    // cin.getline(接收字符串的变量,接收字符个数,结束字符); 第三个参数系统默认为'\0'
    // 对于cin.getline(m,5,'a'); 当输入jlkjkljkl时输出jklj, 输入jkaljkljkl时输出jk
    
    #include<string.h>
    string str;
    getline(cin,str);	// 输入一行内容
    

    同时使用cin>>、getline()时需要注意,在cin>>输入流完成之后,getline()之前,需要通过str="\n"; getline(cin,str);的方式将回车符作为输入流cin以清除缓存,如果不这样做的话,在控制台上就不会出现getline()的输入提示,而直接跳过,因为程序默认地将之前的变量作为输入流。

  • 字符串的常用函数

    s.size():字符串的长度

    s.empty():字符串是否为空,空返回1,非空返回0

    str.insert(i,s):在原串下标为i的字符串str前插入字符串s

    str.rfind(s):从字符串右侧开始匹配str,并返回在字符串中的位置(下标),即s在str最后一次出现的位置

    str.rfind(s,pos):从pos+str.size()该位置开始(不包括该位置字符)向前寻找匹配项,如果有则返回字符串位置,如果没有则返回string::npos

    str.find(s):返回第一次匹配字符串s的位置,如果没有则返回string::npos

    str.find(s,pos):从pos开始(包括pos处字符)匹配s的位置

    s1.replace(pos, len, s2):把 s1 中从下标 pos 开始的长度为 len 的子串替换为 s2

    s.erase(pos, len):把 s中从下标 pos 开始的长度为 len 的子串删除

    string支持> < == >= <= 等所有比较操作,按字典序进行比较

    string s = "hello";
    for (char c : s) cout << c << endl;
    for (char &c : s) c = 'a';	// s = "aaaaa"
    for (auto c : s) cout << c << endl;
    
  • 做加法运算时,字面值和字符都会被转化成string 对象,因此直接相加就是将这些字面值串联起来。当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string

    string s1 = "hello";
    string s2 = s1 + ',' + 'world';	// 正确
    string s3 = 'hello' + ',' + s2;	// 错误
    
  • AcWing 768. 忽略大小写比较字符串大小 - AcWing

    tolower(s):把字符串都转化为小写字母

    touppre(s):把字符串都转化为大写字母

  • AcWing 767. 信息加密 - AcWing:循环要善用求余

  • AcWing 770. 单词替换——巧用 string 函数 - AcWing

  • AcWing 775. 倒排单词-()-最快乐的题解 - AcWing

  • 第一类双指针算法

    for (int i = 0; i < len(s); i++)
    {
        int j = i;
        while (j < len(s) && s(j) == s(i)) j++;
        i = j - 1;	// 循环结束后跳过j这一段
    }
    
  • AcWing 771. 字符串中最长的连续出现的字符 - AcWing:应用第一类双指针算法

  • AcWing 777. 字符串乘方 - AcWing:(s[j] !=s[j%i]) 巧妙!注意n肯定是len的约束

    AcWing 777. 字符串乘方——使用 substr 和 find 函数巧妙解题 - AcWing

    AcWing 777. 字符串乘方(STL 与 KMP) - AcWing:判断字符串拼接后和原字符串是否相等

  • AcWing 779. 最长公共字符串后缀----reverse函数 - AcWing:sort函数用法很巧妙!只需要比较最长和最短的公共字符串了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值