数组
字符串
所有题目来自ACWing
👇从零开始学C++系列👇
从零开始学C++之基本知识
从零开始学C++之数组和字符串
从零开始学C++之函数、结构体、类、指针、引用
从零开始学C++之STL容器、位运算与常用库函数
数组
知识点
全局变量的定义,默认值为0
,存在堆空间,无长度限制,堆里虚拟分配,使用再开内存,没开的时候标记全部指向0,零页
局部变量,默认值是随机的,存在栈空间,在栈空间中的变量会占内存
定义数组
int a[100], b[10];
float c[20];
double d[10];
char e[14];
string g[25]; // 字符串数组 单个元素是一个字符串
//相当于二维数组
cstring
头文件中的一些函数
memset()
初始化: -> 比循环赋值效率高- 赋值是按字节赋值,因此只有赋予
-1
和0
时才与预期一致。其最后一个参数的单位是Byte
格式memset(数组名, 将每个字节初始化成什么值, 初始多长(单位是Byte))
例如:memset(a, 0, sizeof a);
将数组a赋为全0 memcpy()
复制:- 格式:memcpy(目标数组名, 源数组名, 源数组Byte长度)
memcpy(b, a, sizeof a);
sizeof 可不加括号,即可这样使用sizeof a,其返回单位是Byte
题目
753. 平方矩阵 I
754. 平方矩阵 II
756. 蛇形矩阵
字符串
ASCII码
背下来
- 48 ~ 57 : 0 ~ 9
- 65 ~ 90 : A ~ Z
- 97 ~ 127 : a ~ z
字符数组
字符串是字符数组加上结束符"\0",字符数组长度至少比字符串多1
//环境 VSCode
char a1[] = {'B', '+', '+', '\0'};
char a2[] = "C++";
char a3[] = {'A', '+', '+'};
char a4[] = {'C', '\0'};
cout << sizeof a2 << endl; // 4
cout << sizeof a3 << endl; // 3
printf("%s\n", a2);//输出是C++
printf("%s\n", a3); //输出是A++C++
字符串输入输出
- 输入
C语言
char s[N];
scanf("%s", s); // 不能读取含空格、换行符的字符串
gets(s); // 能读取含空格的字符串,同时自动去掉换行符\n
fgets(s, N, stdin); // 能读取含空格的字符串,但不会去掉换行符\n。【注意】
C++
#include <string>
string str;
cin >> str; // 能读取含空格、不能读换行符的字符串
getline(cin, str); // 能读取含空格的字符串,同时自动去掉换行符\n
- 输出
puts(s);
printf("%s\n", s);
cout << s << endl;
字符串操作
库<string>
#include <string>
// 初始化
string s1; // 默认空字符串
string s2 = s1; // s2是s1的一个副本
string s2 = "hiya"; // s3是该字符串字面值的一个副本
string s4(10, 'c'); // s4的内容是cccccccccc
//读入/输出
//不能用scanf读入,但可以用printf输出
cin >> s1;
getline(cin, s1);
printf("%s", s1.c_str()); // 返回存储s1的字符数组的首地址,用printf输出
puts(s1);
s1.empty(); // 判断是否为空字符串
s1.size(); // 长度,与stelen()不同的是,这个复杂度是O(1),不用额外的变量保存
s1.pop_back(); // 删掉最后一个字符
s1.substr(begin, length); //位置指定的子串
// 按字典序比较 ">"、"<"
// 加法拼接时,要保证加号两边至少有一个string变量
for (char ch : str) {...} // 遍历(不可修改字符)
for (char &ch : str) {...} // 遍历(可修改字符)
auto s; // 可以自动判别类型
遍历字符串
双指针算法
从前向后遍历整个字符串
for(i=0;i<len;i++)
{
//用j把和s[i]相等的这一整段全部找到
int j = i;
while(j<len&&s[j]==s[i])
j++;
//j是不等于i的第一个字符
i = j-1;
}
字符串流
库<sstream>
#include <sstream>
string s;
stringstream ssin(s);
while(ssin >> s) {...} // 按空格拆分成 字符串s,例如英语句子拆分单词
// 可用如下代码代替
while(cin >> word) {
...
}
题目
763. 循环相克令
772. 只出现一次的字符
770. 单词替换
771. 字符串中最长的连续出现的字符
777. 字符串乘方
779. 最长公共字符串后缀