- C++
0709学习笔记
- 2025-7-9 22:04:30 @
以下将围绕 字符串处理 核心知识点,结合题目场景,用小学生能懂的话+代码注释,带大家复习字符串函数用法,还会拆解题目解题思路,让知识 “活” 起来 👇
一、先复习字符串基础 & 常用函数(C++ 版)
1. 字符串是什么?
可以把字符串想象成 “一串字符”,像 “abc”“hello” ,就是把单个字母 / 符号连起来,在代码里用 string
类型存 。比如:
string str = "abcde"; // 存了字符 a、b、c、d、e
2. 常用字符串函数(超简化解释)
size()
/length()
:数字符串里有几个字符。比如 “abc” 用str.size()
,就会得到 3 ,像数小方块数量一样简单~
string str = "apple";
int len = str.size(); // len 就是 5 ,因为有 a、p、p、l、e 这 5 个字符
substr()
:从字符串里 “截出一段” 小字符串。它有两种常用写法:substr(起始下标, 长度)
:从下标对应的位置,截指定长度。下标从 0 开始数!比如 “abcdef” ,substr(1, 3)
就是从第 2 个字符(下标 1 )开始,截 3 个字符,得到 “bcd” 。substr(起始下标)
:从起始下标开始,截到字符串末尾。比如 “abcdef” ,substr(2)
就是从下标 2(字符 c )开始,截到最后,得到 “cdef” 。
string str = "abcdefg";
// 从下标 2 开始,截 3 个字符 → "cde"
string part1 = str.substr(2, 3);
// 从下标 4 开始,截到末尾 → "efg"
string part2 = str.substr(4);
- 遍历字符串 :像挨个点名一样,把每个字符看一遍。用
for
循环,结合size()
就能实现:
string str = "hello";
// i 从 0 到 4(因为 size 是 5 ),逐个访问字符
for (int i = 0; i < str.size(); i++) {
// 输出每个字符,h、e、l、l、o 会挨个打印
cout << str[i] << endl;
}
二、结合题目,用字符串函数解题(选 1 道典型题讲~比如 “回文拼接” )
题目要求:判断字符串是否由 两个长度至少为 2 的回文串 拼接而成。
1. 先理解 “回文串”
回文串就是 “正着读、反着读都一样” 的字符串,比如 “aba”“aa” 。判断回文可以写个小函数:
// 判断字符串 str 是否是回文
bool isHuiWen(string str) {
int len = str.size();
// 从两头往中间比,只要有不一样就不是回文
for (int i = 0; i < len / 2; i++) {
if (str[i] != str[len - 1 - i]) {
return false; // 不一样,返回 false
}
}
return true; // 全一样,是回文,返回 true
}
解释 :比如字符串长度是 5 ,下标 0 和 4 比、1 和 3 比,中间下标 2 不用比(自己和自己一样);如果长度是 4 ,下标 0 和 3 比、1 和 2 比 。
2. 整体解题思路(用字符串函数实现)
- 输入字符串后,先看长度够不够(因为要拆成 两个长度≥2 的回文,所以原字符串长度至少得是 4 !比如 “aa”+“aa” 长度是 4 )。如果长度小于 4 ,直接输出 “No” 。
- 然后用
substr
把字符串拆开,尝试所有可能的 “分割点” :- 比如字符串长度是 5 ,分割点可以是下标 2(拆成前 2 个字符、后 3 个字符)、下标 3(前 3 个、后 2 个)…… 只要保证 前半段长度≥2,后半段长度也≥2 就行!
- 对每个分割出的
left
(前半段)和right
(后半段),用isHuiWen
函数判断是否都是回文。如果找到一组符合条件的,就输出 “Yes” ;否则输出 “No” 。
3. 完整代码 + 注释(小学生能懂的白话注释!)
#include <iostream>
#include <string>
using namespace std;
// 判断是否是回文串的函数
bool isHuiWen(string str) {
int len = str.size();
// 从两边往中间对比
for (int i = 0; i < len / 2; i++) {
// 只要有一对字符不一样,就不是回文
if (str[i] != str[len - 1 - i]) {
return false;
}
}
// 全部对比完都一样,是回文
return true;
}
int main() {
int n;
// 输入要判断的字符串数量
cin >> n;
while (n--) { // 循环 n 次,处理每个字符串
string s;
// 输入当前要判断的字符串
cin >> s;
// 长度小于4,没法拆成两个长度≥2的串,直接输出No
if (s.size() < 4) {
cout << "No" << endl;
continue; // 跳过后面,处理下一个字符串
}
bool found = false; // 标记是否找到符合条件的拆分
// 尝试所有可能的分割点:从分割后左边长度2开始,到左边长度 总长度-2 结束
for (int lenLeft = 2; lenLeft <= s.size() - 2; lenLeft++) {
// 用substr截出左边字符串,长度是 lenLeft
string left = s.substr(0, lenLeft);
// 截出右边字符串,从lenLeft位置开始,到末尾
string right = s.substr(lenLeft);
// 判断左右是否都是回文
if (isHuiWen(left) && isHuiWen(right)) {
found = true; // 找到符合条件的啦!
break; // 不用再找其他分割点,跳出循环
}
}
// 根据found的值输出结果
if (found) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
return 0;
}
代码运行逻辑演示(以样例输入 “aabbbb” 为例):
- 字符串长度是 6 ,满足 ≥4 。
- 分割点尝试
lenLeft=2
:left
是 “aa”(回文),right
是 “bbbb”(回文)→ 符合条件,输出 “Yes” 。
三、其他题目里的字符串知识关联(简单提一下~)
- 进制转换题目 :输入里的 “K 进制数” 是字符串形式(比如 “3F0” ),需要遍历每个字符,把它们转成数字,再按进制规则计算。这也会用到字符串遍历(
str[i]
取字符 ),以及字符转数字的操作(比如字符'A'
转成 10 ,可以用str[i] - 'A' + 10
这类方法 )。 - X 字矩阵题目 :虽然主要是字符数组拼接,但构建每一行字符串时,也可以用字符串拼接的思路(比如先建一个全是 “-” 的字符串,再把对角线位置换成 “+” ),变相练习字符串的 单个字符修改(
str[i] = '+'
)。
四、总结 & 复习建议
-
字符串函数关键考点 :
- 用
size()
测长度、substr()
截取子串 。 - 遍历字符串,访问每个字符
str[i]
。 - 结合题目逻辑(比如回文判断、拆分拼接 ),把函数用起来解决实际问题!
- 用
-
练习小方法 :
- 把代码里的函数单独拿出来,自己改改参数测试(比如换不同字符串截
substr
,看结果对不对 )。 - 对着题目,用 “白话流程” 再讲一遍思路(像给同学讲题一样 ),确认自己真的懂啦~
- 把代码里的函数单独拿出来,自己改改参数测试(比如换不同字符串截
这样字符串函数就复习好啦!代码里的注释很详细,慢慢读、跟着跑一遍例子,就能掌握用法啦,加油~ 有不懂的随时再问!
1 条评论
-
admin SU @ 2025-7-9 22:05:36
编程小课堂:字符串函数与趣味题目实战
一、课前准备
小朋友们,我们要开启超有趣的编程小旅程啦!这次会用到字符串(就像一串字符小伙伴手拉手),还有解决几个好玩的题目,准备好和我一起出发了吗?
二、认识字符串与常用函数(基础版)
(一)什么是字符串
字符串就是把好多单个字符(像字母
a
、数字5
、符号@
这些)连在一起,比如"abc"
,就像三个字符小伙伴a
、b
、c
手拉手排排站 。在 C++ 里,我们用string
来表示它,比如:// 定义一个字符串变量 str ,里面存着 "hello" string str = "hello";
(二)常用字符串函数
size()
函数——数字符个数 就像数小饼干有几块,size()
能告诉我们字符串里有多少个字符。
string str = "apple"; // 数 apple 里的字符,a、p、p、l、e 一共 5 个,len 就会是 5 int len = str.size(); cout << len << endl;
substr()
函数——截取子串 想象把一长串糖葫芦截成小段,substr
能从字符串里截出一小段。它有两种常用用法:
- 用法一:
substr(起始下标, 要截取的长度)
。下标从0
开始数哦!比如字符串是"abcdef"
,substr(1, 3)
就是从第 2 个字符(下标1
对应的b
)开始,截 3 个字符,得到"bcd"
。 - 用法二:
substr(起始下标)
,从起始下标开始,一直截到字符串末尾。比如"abcdef"
用substr(2)
,就从下标2
(c
)开始,截出"cdef"
。
string str = "abcdefg"; // 从下标 2 开始,截 3 个字符,得到 "cde" string part1 = str.substr(2, 3); // 从下标 4 开始,截到末尾,得到 "efg" string part2 = str.substr(4); cout << part1 << endl; cout << part2 << endl;
- 遍历字符串——和每个字符打招呼
就像挨个叫小朋友名字,我们可以用
for
循环,一个一个访问字符串里的字符。
string str = "hello"; // i 从 0 到 4(因为 hello 有 5 个字符,下标 0 到 4 ) for (int i = 0; i < str.size(); i++) { // 输出每个字符,会依次打印 h、e、l、l、o cout << str[i] << endl; }
三、实战题目一:回文拼接大挑战(4078 题)
(一)题目理解
要判断一个字符串能不能分成两个部分,每个部分至少有 2 个字符,而且每个部分都是回文(正着读和反着读一样,像
"aba"
、"aa"
这样)。比如"aabbbb"
,能分成"aa"
(回文)和"bbbb"
(回文),就符合要求 。(二)解题步骤 & 代码实现
- 先写判断回文的小帮手函数 我们需要一个函数,判断一个字符串是不是回文。思路就是从字符串两头往中间比,要是都一样,就是回文啦!
// 这个函数叫 isHuiWen ,专门判断字符串 str 是不是回文 bool isHuiWen(string str) { int len = str.size(); // 从两边往中间对比,i 从 0 开始,到字符串一半的位置 for (int i = 0; i < len / 2; i++) { // 左边第 i 个字符和右边第 i 个字符对比 if (str[i] != str[len - 1 - i]) { // 不一样,就不是回文,返回 false return false; } } // 全部对比完都一样,是回文,返回 true return true; }
- 主函数处理输入输出和逻辑判断
#include <iostream> #include <string> using namespace std; // 上面的 isHuiWen 函数放这里哦 int main() { int n; // 输入有几个字符串要判断 cin >> n; // 循环 n 次,处理每个字符串 while (n--) { string s; // 输入当前要判断的字符串 cin >> s; // 字符串长度小于 4 ,没法分成两个至少 2 个字符的部分,直接输出 No if (s.size() < 4) { cout << "No" << endl; // 跳过这次循环,处理下一个字符串 continue; } bool found = false; // 标记有没有找到符合条件的拆分 // 尝试所有可能的分割点,左边长度从 2 开始,到总长度 - 2 结束(保证右边也至少 2 个字符) for (int lenLeft = 2; lenLeft <= s.size() - 2; lenLeft++) { // 截取左边的子串,长度是 lenLeft string left = s.substr(0, lenLeft); // 截取右边的子串,从 lenLeft 位置开始到末尾 string right = s.substr(lenLeft); // 判断左右两边是不是都是回文 if (isHuiWen(left) && isHuiWen(right)) { found = true; // 找到符合条件的啦 // 找到就不用再试其他分割点,跳出循环 break; } } // 根据 found 的结果输出 if (found) { cout << "Yes" << endl; } else { cout << "No" << endl; } } return 0; }
(三)代码运行示例
比如输入样例里的
"aabbbb"
:- 字符串长度是 6 ,满足 ≥4 。
- 分割点试到
lenLeft = 2
时,left
是"aa"
(回文),right
是"bbbb"
(回文),所以输出"Yes"
。
四、实战题目二:进制转换小能手(4019 题)
(一)题目理解
把不同进制(像二进制、八进制、十六进制)的数,转换成十进制。比如八进制
1362
,要转换成十进制的754
;十六进制3F0
转换成十进制的1008
。(二)解题思路 & 代码实现
-
核心思路 对于一个
K
进制数,从右往左,每一位的 “权值” 是K^0
、K^1
、K^2
…… (比如十进制数123
,3
的权值是10^0
,2
是10^1
,1
是10^2
)。我们要把每一位的数字乘以对应的权值,再加起来,就得到十进制数啦! -
代码实现
#include <iostream> #include <string> // 用到 pow 函数(计算次方),需要这个头文件 #include <cmath> using namespace std; // 把字符转换成对应的数字,比如 'A' 转成 10 ,'3' 转成 3 int charToNum(char c) { if (c >= '0' && c <= '9') { // 数字字符,直接减去 '0' 得到对应的数字 return c - '0'; } else { // 字母字符,比如 'A' ,减去 'A' 再加 10 ,得到 10 return c - 'A' + 10; } } int main() { int N; // 输入要转换的数的个数 cin >> N; while (N--) { int K; string s; // 输入进制 K 和要转换的 K 进制数(字符串形式) cin >> K >> s; int result = 0; int len = s.size(); // 从字符串左边到右边遍历(对应进制数从高位到低位) for (int i = 0; i < len; i++) { char c = s[i]; // 转换成对应的数字 int num = charToNum(c); // 计算当前位的权值,比如 K 进制数,第 i 位(从 0 开始数)的权值是 K 的 (len - 1 - i) 次方 int power = len - 1 - i; // 数字乘以权值,累加到结果 result += num * pow(K, power); } // 输出转换后的十进制数 cout << result << endl; } return 0; }
(三)代码运行示例
比如输入八进制
1362
:- 各位数字是
1
、3
、6
、2
。 - 权值分别是
8^3
、8^2
、8^1
、8^0
。 - 计算:
1*8^3 + 3*8^2 + 6*8^1 + 2*8^0 = 512 + 192 + 48 + 2 = 754
,输出754
。
五、实战题目三:X 字矩阵大画家(4015 题)
(一)题目理解
要画出一个
N×N
的矩阵(N
是奇数),两条对角线位置是+
,其他位置是-
。比如N=5
时,就会画出一个像 X 形状的图案 。(二)解题思路 & 代码实现
-
核心思路 对于矩阵的每一行,每一列,如果是对角线位置(行号和列号相同,或者行号 + 列号 =
N - 1
),就输出+
,否则输出-
。 -
代码实现
#include <iostream> using namespace std; int main() { int N; // 输入矩阵的大小 N cin >> N; // 循环 N 次,打印 N 行 for (int i = 0; i < N; i++) { // 循环 N 次,打印每行的 N 个字符 for (int j = 0; j < N; j++) { // 对角线位置:行号等于列号,或者行号 + 列号等于 N - 1 if (i == j || i + j == N - 1) { cout << "+"; } else { cout << "-"; } } // 一行打印完,换行 cout << endl; } return 0; }
(三)代码运行示例
当输入
N=5
时:- 第一行,
i=0
,j
分别为 0(+
,因为0==0
)、1(-
)、2(-
)、3(-
)、4(+
,因为0+4=4
,N-1=4
),所以第一行是+-+--+
?不对,重新看: 哦,N=5
时,每行j
从 0 到 4 : - 第 0 行(
i=0
):j=0
:i==j
→+
j=1
:不满足 →-
j=2
:不满足 →-
j=3
:不满足 →-
j=4
:i + j = 0 + 4 = 4
,N-1=4
→+
所以第一行是+-+--+
?不对,应该是+---+
?哦,我算错啦,N=5
时,每行 5 个字符: 第 0 行:j=0
→+
j=1
→-
j=2
→-
j=3
→-
j=4
→+
所以第一行是+---+
(因为中间三个-
)。继续打印其他行,最后就会得到题目里的 X 形状啦!
六、总结复习
- 字符串函数 :
size()
数字符个数,substr()
截取子串,还能遍历字符串访问每个字符。 - 题目实战 :
- 回文拼接:用函数判断回文,再拆分字符串尝试拼接。
- 进制转换:利用权值计算,把不同进制转十进制。
- X 字矩阵:根据行列位置判断输出
+
还是-
。
小朋友们,多敲敲代码,自己改改参数试试,就能更熟练啦!编程就像搭积木,多练习就能搭出超有趣的作品哟~ 有不懂的地方,随时找老师问呀!
- 1