1. 循环与函数基础
1)循环执行次数:while 和 do-while 的核心区别是:do-while 至少执行一次,两者执行次数不一定相同。
2)函数参数传递:值传递参数在函数内修改,不会影响实参;若要修改需用引用(&)或指针。
3)函数声明与定义:自定义函数可以写在主函数后面,但必须在主函数之前进行函数声明。
💡 复习建议:深刻理解函数栈帧、值传递与引用传递的底层区别。
2. 字符串处理
1)strcmp 函数:返回 0 代表两个字符串完全相等;返回负数代表前者小,正数代表前者大。
2)strlen 函数:strlen("abcd") 的值是 4(不包含 \0)。
3)string 类:find 找不到子串时返回 string::npos(通常是一个极大值),不是 0。
4)string 拼接:string 类型可以直接用 + 拼接字符串。
💡 复习建议:熟练区分 C 风格字符串函数(strlen, strcmp, strcpy)与 C++ string 类的方法。
3. 算法与数据结构
1)二分查找:时间复杂度为 O(log n),每次可以排除一半的区间。
2)排序算法稳定性:冒泡排序是稳定的;选择排序是不稳定的。
3)结构体比较:两个同类型的结构体变量不能直接用 == 比较是否相等(需手动写成员逐个比较)。
💡 复习建议:掌握各类排序算法的时空复杂度及稳定性,理解结构体在内存中的对齐与比较逻辑。
4. 编程题专项
1)二维图案输出(花园种植):考察二维数组的边界(上下左右)、两条对角线(ij 和 i+jn-1)的条件判断。
2)二分查找应用题(找最后一个 <= x 的下标):二分查找的变种,注意边界处理、相等时的收缩方向、以及不存在时的输出 -1。
3)数字金字塔(动态规划/DP):典型 DP 问题。从底层向上推,状态转移方程为 dp[i][j] = max(dp[i+1][j], dp[i+1][j+1]) + a[i][j],也可以自顶向下记忆化搜索。
💡 复习建议:重点掌握二维数组图形打印、二分查找边界处理、动态规划(数字三角形模型)。多画图,理清下标变化规律。
二、C++中学组——练习答案
F T F F T T T F F T
1. 花园图案
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 输入图案的大小,最终输出 n 行 n 列
}
2. 二分查找最后一个 ≤ x 的元素
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
cin >> n; // 输入数组长度
}
3. 数字金字塔最大路径和
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int r;
cin >> r; // 输入数字金字塔的行数
}