1. 东华OJ基础题28-30题解析
作为一名计算机专业的学生,刷OJ(Online Judge)是提升编程能力的必经之路。东华OJ作为国内高校常用的在线评测系统,其基础题目对于培养编程思维和算法能力非常有帮助。今天我就来详细解析东华OJ基础题28-30题,分享我的解题思路和实战经验。
这三道题主要考察数组操作、循环控制和基础算法的应用,难度适中但非常考验编程基本功。我在初次尝试时也踩过不少坑,后来通过反复练习才掌握了其中的技巧。下面我会逐题分析,给出多种解法,并分享一些调试技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 题目28:数组元素循环右移
2.1 题目要求分析
这道题要求将一个长度为n的数组循环右移m个位置。例如,数组[1,2,3,4,5]右移2位后变为[4,5,1,2,3]。看似简单,但有几个关键点需要注意:
- 右移位数m可能大于数组长度n,此时实际移动次数应为m%n
- 要求空间复杂度为O(1),即不能使用额外数组
- 输入输出格式要严格符合题目要求
2.2 三种解法对比
我尝试过三种不同的解法,各有优缺点:
解法一:三次反转法
- 反转整个数组
- 反转前m个元素
- 反转剩余元素
时间复杂度O(n),空间复杂度O(1)
c复制void reverse(int *a, int start, int end) {
while(start < end) {
int temp = a[start];
a[start] = a[end];
a[end] = temp;
start++;
end--;
}
}
void rotate(int *a, int n, int m) {
m = m % n;
reverse(a, 0, n-1);
reverse(a, 0, m-1);
reverse(a, m, n-1);
}
解法二:逐个移动法
每次右移一位,循环m次。虽然思路简单,但时间复杂度为O(n*m),效率较低。
解法三:使用额外数组
不符合题目空间复杂度要求,但容易理解和实现。
提示:OJ系统通常会检查内存使用,解法二和三可能无法通过所有测试用例。
