C++算法基础语法
1.1 变量、输入输出、表达式和顺序语句
-
#include <iostream>
:包含cin、cout、endl输入输出函数#include <cstdio>
:包含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
-
运用头文件
<iomanip>
的函数fixed<<setprecision(保留位数)
设置输出的小数点位数,具体格式为:cout << fixed << setprecision(n) << 变量 <<endl;
-
运用头文件
<cmath>
的函数sqrt()
计算根号,利用函数pow(x,n)
计算xn -
(4/3) 无法得到 1.3333…,需要使用 (4/3.0)
-
%要求两个操作数均为整数或可以隐式转换成整数的类型
1.2 判断语句
-
printf("%5d")
:表示输出五位整数,不足的在左边补上空格;如果是-5,则在右边补上空格printf("%05d")
:表示输出五位整数,不足的在左边补上0浮点数同理,在小数点前写
-
printf(“%%”):表示输出%
1.3 循环结构
-
716. 最大数和它的位置 - AcWing题库:不要脑子里只有数组
-
AcWing 725. 完全数 c++详解 算法优化 - AcWing i < sqrt(a)
-
AcWing 727. 菱形 - AcWing:使用曼哈顿距离判断
#include<iostream> #incldue<cmath> 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}
-
floor(x)
返回小于或等于x的最大整数,ceil(x)
返回的是大于x的最小整数,<cmath>
1.5 字符串
-
ASCII中48-57是0-9,65-90是A-Z,97是a,32是空格
-
可以使用字符串来初始化字符数组,但此时要注意,每个字符串结尾会暗含一个’\0’字符,因此字符数组的长度至少要比字符串的长度多1。
-
输入输出
scanf
和cin
都是遇到回车或者空格停止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返回-1strcpy(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,非空返回0str.insert(i,s)
:在原串下标为i的字符串str前插入字符串sstr.rfind(s)
:从字符串右侧开始匹配str,并返回在字符串中的位置(下标),即s在str最后一次出现的位置str.rfind(s,pos)
:从pos+str.size()该位置开始(不包括该位置字符)向前寻找匹配项,如果有则返回字符串位置,如果没有则返回string::nposstr.find(s)
:返回第一次匹配字符串s的位置,如果没有则返回string::nposstr.find(s,pos)
:从pos开始(包括pos处字符)匹配s的位置s1.replace(pos, len, s2)
:把 s1 中从下标 pos 开始的长度为 len 的子串替换为 s2s.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:循环要善用求余
-
第一类双指针算法
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函数用法很巧妙!只需要比较最长和最短的公共字符串了