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

C++算法基础语法

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

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

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

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

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

  • 类型 细节 字节byte
    布尔型bool false/true,输入为%d 1
    int -2147483648 ~ 2147483647(-231~231-1) 4
    单精度浮点数float 可以表示科学计数法1.2e3 = 1200,6-7位有效数字 4
    double 15-16位有效数字 8
    long long -263 ~ 263-1 8
    long double 18-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

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

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

  • 604. 圆的面积 - AcWing题库
    C++算法基础语法注意点(自用) - acwing_第1张图片

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

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

  • 656. 钞票和硬币 - AcWing题库
    C++算法基础语法注意点(自用) - acwing_第2张图片在这里插入图片描述在这里插入图片描述

1.2 判断语句

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

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

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

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

1.3 循环结构

  • 716. 最大数和它的位置 - AcWing题库:不要脑子里只有数组
    C++算法基础语法注意点(自用) - acwing_第3张图片

  • AcWing 725. 完全数 c++详解 算法优化 - AcWing i < sqrt(a)

  • AcWing 726. 质数-语法题-C+±详细 - AcWing i < n/i

  • AcWing 727. 菱形 - AcWing:使用曼哈顿距离判断
    C++算法基础语法注意点(自用) - acwing_第4张图片

    #include
    #incldue
    using namespace std;
    
    int main()
    {
        int n;
        cin >> n;
        int cx, cy;
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++)
                if(abs(cx-i) + abs(cy-j) <= n/2) cout << '*';	// 空心是==
                else cout << ' ';
            cout << endl;
        }
        return 0;
    }
    

1.4 数组

  • int a[5] = {0, 1, 2}等价于int a[5] = {0, 1, 2, 0, 0}

  • AcWing 753. 平方矩阵 I(曼哈顿距离思想求解+蛇形矩阵思想求解+观察法求解) - AcWing
    C++算法基础语法注意点(自用) - acwing_第5张图片

  • floor(x)返回小于或等于x的最大整数,ceil(x)返回的是大于x的最小整数,

  • 756. 蛇形矩阵 - AcWing题库
    C++算法基础语法注意点(自用) - acwing_第6张图片C++算法基础语法注意点(自用) - acwing_第7张图片

1.5 字符串

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

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

  • 输入输出
    C++算法基础语法注意点(自用) - acwing_第8张图片

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

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

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

  • 字符数组常用操作——引入

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

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

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

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

  • 字符串的定义
    C++算法基础语法注意点(自用) - acwing_第9张图片

  • 字符串的输入输出

    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 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函数用法很巧妙!只需要比较最长和最短的公共字符串了

你可能感兴趣的:(算法,c++)