作为一名计算机专业的学生,刷OJ题是提升编程能力的必经之路。最近在准备东华大学的复试,我坚持每天打卡3道OJ基础题,并将解题过程和心得记录下来。今天分享的是第19到21题的详细解析,包含代码实现、易错点和优化思路。
这道题要求我们找出数字序列中连续出现次数最多的数字,如果有多个数字的连续出现次数相同,则输出第一次出现的那个数字。
题目看似简单,但有几个关键点需要注意:
正确的解法应该:
原代码存在逻辑错误,它统计的是总出现次数而非连续出现次数。下面是修正后的实现:
c复制#include <stdio.h>
#define MAX 100
int main() {
int length;
while (scanf("%d", &length) != EOF) {
int num[MAX];
for (int i = 0; i < length; i++) {
scanf("%d", &num[i]);
}
int max_num = num[0], max_count = 1;
int current_num = num[0], current_count = 1;
for (int i = 1; i < length; i++) {
if (num[i] == current_num) {
current_count++;
} else {
if (current_count > max_count) {
max_count = current_count;
max_num = current_num;
}
current_num = num[i];
current_count = 1;
}
}
// 处理最后一个数字序列
if (current_count > max_count) {
max_count = current_count;
max_num = current_num;
}
printf("%d %d\n", max_num, max_count);
}
return 0;
}
提示:在处理连续性问题时,建议在纸上画出数组元素的连续情况,这样更容易理清思路。
题目给出方程a² + x² = b² + y²,已知a和b,要求找出所有x和y(x,y ≤ 100)满足这个等式,并按x从小到大输出。
这道题需要找到所有满足条件的整数对(x,y),其中x和y的范围都是1到100。关键在于如何高效地找到这些解,避免不必要的计算。
最直观的方法是双重循环遍历所有可能的x和y组合,检查是否满足方程。但这种方法时间复杂度为O(n²),当n=100时,需要10000次循环。
优化思路:
c复制#include <stdio.h>
#include <math.h>
int main() {
int a, b;
while (scanf("%d %d", &a, &b) != EOF) {
int right = b * b - a * a;
for (int x = 1; x <= 100; x++) {
for (int y = 1; y <= 100; y++) {
if (x * x - y * y == right) {
printf("%d %d\n", x, y);
break; // 找到最小的y即可
}
}
}
printf("\n");
}
return 0;
}
注意:虽然双重循环看起来效率不高,但对于n=100的情况已经足够。如果n更大,可以考虑更优化的数学方法。
题目要求生成如1+2+3+4+3+2+1这样的累加式,给定最大值N,生成从1加到N再加回到1的表达式。
这道题考察字符串拼接和循环控制。需要:
可以分成两部分处理:
c复制#include <stdio.h>
int main() {
int N;
while (scanf("%d", &N) != EOF) {
if (N == 1) {
printf("1\n");
continue;
}
// 上升部分
for (int i = 1; i <= N; i++) {
printf("%d", i);
if (i != N) printf("+");
}
// 下降部分
for (int j = N - 1; j >= 1; j--) {
printf("%d", j);
if (j != 1) printf("+");
}
printf("\n");
}
return 0;
}
技巧:处理字符串连接问题时,可以先把所有元素存入数组,最后统一处理连接符,这样逻辑更清晰。
通过这三道题的练习,我总结了以下几点经验:
很多错误源于对题目要求的误解。例如基础19题,我最初就混淆了"连续出现次数"和"总出现次数"的概念。建议:
设计全面的测试用例能帮助发现代码中的问题:
为了提升OJ解题能力,我计划从以下几个方面继续努力:
这三道题虽然基础,但涵盖了数组处理、数学运算和字符串操作等常见考点。通过反复练习和总结,相信编程能力会逐步提升。