完善程序技巧
概念讲解
解题步骤
- 理解算法: 程序在做什么?
- 分析逻辑: 缺失部分的作用是什么?
- 排除选项: 逐一验证
- 代入检验: 用样例验证
常见类型
| 类型 | 说明 |
|---|---|
| 循环条件 | for/while 的条件 |
| 边界条件 | if 的条件 |
| 递推公式 | 赋值语句 |
| 返回值 | return 语句 |
排除法技巧
- 看上下文: 前后代码的逻辑
- 看变量: 变量的含义和用途
- 看输出: 期望的输出结果
- 代入选项: 逐一验证
考点分析
初赛考查方式
- 完善程序题: 补全代码
- 选择题: 选择正确选项
常见考点
- 循环条件判断
- 递推公式推导
- 边界条件确定
例题精讲
例题 1:循环条件
题目: 求 1+2+...+n,循环条件是什么?
1234int sum = 0;
for (int i = 1; ______; i++) {
sum += i;
}解答:
循环条件是 i <= n
例题 2:递推公式
题目: 斐波那契数列,递推公式是什么?
1234f[0] = 0; f[1] = 1;
for (int i = 2; i <= n; i++) {
f[i] = ______;
}解答:
递推公式是 f[i-1] + f[i-2]
练习题
完善程序练习
- 补全求最大值的代码:
123456int maxVal = a[0];
for (int i = 1; i < n; i++) {
if (______) {
maxVal = a[i];
}
}查看答案
答案:a[i] > maxVal
遍历数组,如果当前元素比已知最大值大,就更新最大值。
- 补全判断素数的代码:
1234567bool isPrime(int n) {
if (n < 2) return false;
for (int i = 2; ______; i++) {
if (n % i == 0) return false;
}
return true;
}查看答案
答案:i * i <= n
只需要检查到 sqrt(n) 即可,提高效率。
- 补全求阶乘的代码:
1234567long long factorial(int n) {
long long result = 1;
for (int i = 2; i <= n; i++) {
______;
}
return result;
}查看答案
答案:result *= i
累乘计算阶乘。
- 补全字符串反转的代码:
123456789string reverse(string s) {
int left = 0, right = ______;
while (left < right) {
swap(s[left], s[right]);
left++;
______;
}
return s;
}查看答案
答案:s.length() - 1、right--
双指针法反转字符串。
- 补全二分查找的代码:
12345678910int binarySearch(int a[], int n, int target) {
int left = 0, right = n - 1;
while (______) {
int mid = left + (right - left) / 2;
if (a[mid] == target) return mid;
else if (a[mid] < target) ______;
else ______;
}
return -1;
}查看答案
答案:left <= right、left = mid + 1、right = mid - 1
二分查找的标准写法。
理论题
- 完善程序的关键是什么?
查看答案
完善程序的关键:
- 理解算法:弄清楚程序在做什么
- 分析逻辑:缺失部分在算法中的作用
- 看上下文:前后代码的逻辑关系
- 代入检验:用样例验证答案
- 排除法的步骤是什么?
查看答案
排除法步骤:
- 看上下文:分析前后代码逻辑
- 看变量:理解变量的含义和用途
- 看输出:明确期望的输出结果
- 代入选项:逐一验证每个选项
- 排除错误:排除明显错误的选项
易错点
⚠️ 注意:
- 先理解算法再做题
- 注意边界条件
- 代入样例验证
- 排除明显错误的选项