1. 题目背景与需求分析
2026.2.2这个日期标记的OJ45-47题,从热词关联来看主要涉及一维数组操作、回文数判断和极值求解等经典算法题型。这类题目在东华OJ、华为OJ等国内主流在线判题系统中属于基础但高频的考察点,尤其适合作为数组和数学运算的入门训练。
根据常见的OJ出题模式,45-47题很可能是递进式的系列题目,可能包含以下特征:
- 45题通常考察基础的一维数组输入输出和简单计算
- 46题可能涉及更复杂的数组元素条件判断(如回文数识别)
- 47题往往会要求综合运用前两题的技巧解决稍复杂的问题(如找出满足特定条件的四位数)
提示:实际解题前务必仔细阅读题目描述,确认输入输出格式要求。不同OJ平台对空格、换行的处理可能有细微差异。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. OJ45题:一维数组基础操作
2.1 典型题目还原
假设45题要求如下:
"给定长度为N的一维数组,首先输出所有元素,然后找出并输出最大值及其下标(从0开始计算)"
示例输入:
code复制5
3 1 4 1 5
示例输出:
code复制3 1 4 1 5
5 4
2.2 核心实现代码(C++)
cpp复制#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int arr[n];
// 输入并输出数组
for(int i=0; i<n; i++) {
cin >> arr[i];
cout << arr[i] << (i==n-1 ? "\n" : " ");
}
// 查找最大值
int max_val = arr[0], max_idx = 0;
for(int i=1; i<n; i++) {
if(arr[i] > max_val) {
max_val = arr[i];
max_idx = i;
}
}
cout << max_val << " " << max_idx;
return 0;
}
2.3 易错点分析
- 数组越界:循环条件写成i<=n会导致访问越界
- 初始化问题:max_val未初始化为arr[0]时,若数组全负会出错
- 格式错误:最后一个元素输出后要换行,元素间用空格分隔
- 并列最大值:题目通常要求输出第一个出现的最大值下标
3. OJ46题:回文数判断
3.1 题目场景推测
46题可能要求:"从给定数组中筛选出所有四位回文数,并按输入顺序输出"
回文数定义:正读反读相同的数字,如1221、1331等
示例输入:
code复制6
1001 1234 2332 4567 8888 9999
示例输出:
code复制1001 2332 8888
3.2 实现方案对比
方案一:字符串转换法
cpp复制bool isPalindrome(int num) {
string s = to_string(num);
return s == string(s.rbegin(), s.rend());
}
方案二:数学运算法
cpp复制bool isPalindrome(int num) {
if(num < 1000 || num > 9999) return false;
int original = num, reversed = 0;
while(num > 0) {
reversed = reversed * 10 + num % 10;
num /= 10;
}
return original == reversed;
}
性能对比:数学方法在OJ中通常更快(避免字符串操作开销),但要注意1000-9999的范围判断
3.3 边界情况处理
- 非四位数应直接排除
- 输入可能包含负数需要处理
- 输出格式要求(末尾无多余空格)
4. OJ47题:综合应用
4.1 题目合理推测
结合"给定差值的组合"热词,47题可能是:"找出数组中所有差值为k的数字对,输出这些组合的个数"
示例输入:
code复制6 2
3 1 4 1 5 9
示例输出:
code复制3
解释:(3,1)、(5,3)、(1,3)(注意(1,3)和(3,1)视为相同组合)
4.2 双指针解法实现
cpp复制#include <algorithm>
using namespace std;
int countPairs(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
int left = 0, right = 1, count = 0;
while(right < nums.size()) {
int diff = nums[right] - nums[left];
if(diff == k) {
count++;
// 跳过重复元素
while(left+1 < nums.size() && nums[left] == nums[left+1]) left++;
left++;
right = max(right, left+1);
}
else if(diff < k) right++;
else left++;
}
return count;
}
4.3 复杂度优化技巧
- 先排序:O(nlogn)预处理使双指针成为可能
- 去重处理:连续相同元素时移动指针避免重复计数
- 提前终止:当nums[right]-nums[left]>k且left>=right时结束循环
5. 调试与提交技巧
5.1 本地测试用例设计
建议构建包含以下情形的测试集:
- 极小输入(空数组、单元素)
- 全相同元素数组
- 包含负数的数组
- 刚好满足/不满足条件的边界值
示例测试用例(47题):
code复制3 0
1 1 1
应输出:
code复制1
5.2 OJ提交注意事项
- 编译选项:某些OJ需要选择C++11/14标准
- 输入结束判断:部分题目需要处理到EOF而非固定n
- 输出刷新:cout << endl比'\n'更保险(但稍慢)
- 特殊判题:华为OJ等平台对末尾空格敏感
6. 算法扩展思考
6.1 相似题型变种
- 二维数组版本:在矩阵中寻找满足条件的子区域
- 多条件组合:如同时要求回文且质数的数字
- 动态数据:设计支持插入删除并实时查询的数据结构
6.2 性能优化进阶
对于超大规模数据(如1e6元素):
- 使用哈希表存储元素出现次数(空间换时间)
- 位运算优化判断过程
- 考虑并行化处理(如OpenMP)
cpp复制// 哈希表解法示例(47题)
int countPairs(vector<int>& nums, int k) {
unordered_map<int,int> freq;
for(int num : nums) freq[num]++;
int count = 0;
for(auto& [num,cnt] : freq) {
if(k==0) count += cnt>=2 ? 1 : 0;
else if(freq.count(num+k)) count++;
}
return count;
}
在实际刷题过程中,建议先确保基础解法正确,再逐步优化。东华OJ和华为OJ的题目往往有严格的时间限制,需要根据反馈的TLE(时间超限)情况针对性优化。对于四位数处理类题目,有时预处理所有可能结果(如预先计算所有四位回文数)反而是最高效的方案。
