news 2026/1/19 23:14:16

数据结构期末复习:数组核心操作全解析(含代码实现与复杂度分析)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据结构期末复习:数组核心操作全解析(含代码实现与复杂度分析)

数据结构期末复习:数组核心操作全解析(含代码实现与复杂度分析)

前言
在数据结构期末考试中,数组作为最基础、最常考的数据结构之一,其核心操作是高频考点。本文系统梳理了五大经典数组操作题型——合并、交并集、拆分、去重等,结合实验场景,提供完整 Java 代码实现、时间/空间复杂度分析及易错点提醒,助你高效备考,稳拿高分!


一、复习核心考点清单

  1. 两个有序数组合并(双指针经典应用)
  2. 无序集合的交集与并集(HashSet 去重特性)
  3. 有序集合的交集与并集(利用有序性优化)
  4. 字符数组拆分(数字/字母分类)
  5. 有序数组去重(两种时间复杂度算法对比)

二、各考点详细解析(含代码 + 思路)

考点1:两个有序数组合并

📌 题目要求

将两个非递减有序数组合并为一个新的非递减有序数组,要求时间复杂度最优。

💡 实现思路
  • 核心算法:双指针法(避免冗余排序)
  • 时间复杂度O(n + m)
  • 步骤
    1. 处理边界情况(任一数组为空直接返回另一个)
    2. 初始化双指针i,j和结果指针k
    3. 比较元素,小者入结果数组,对应指针后移
    4. 将剩余未遍历元素全部追加
✅ 完整代码(Java)
publicstaticint[]mergeSortedArrays(int[]arr1,int[]arr2){if(arr1==null)returnarr2;if(arr2==null)returnarr1;int[]result=newint[arr1.length+arr2.length];inti=0,j=0,k=0;while(i<arr1.length&&j<arr2.length){if(arr1[i]<=arr2[j]){result[k++]=arr1[i++];}else{result[k++]=arr2[j++];}}while(i<arr1.length)result[k++]=arr1[i++];while(j<arr2.length)result[k++]=arr2[j++];returnresult;}
⚠️ 期末易错点
  • 忽略空数组边界条件(如arr1 == null
  • 结果数组长度错误(应为arr1.length + arr2.length
  • 遗漏处理剩余元素(导致部分数据丢失)

考点2:无序集合的交集与并集

📌 题目要求

给定两个可能含重复元素的无序数组,求交集(共同元素)和并集(所有元素去重)。

💡 实现思路
  • 核心数据结构HashSet(自动去重 + O(1) 查询)
  • 交集:先存入 set1,再遍历 set2 筛选存在元素
  • 并集:直接将两数组元素加入同一 HashSet
✅ 完整代码
// 交集publicstaticint[]findIntersection(int[]set1,int[]set2){Set<Integer>tempSet=newHashSet<>();Set<Integer>intersectionSet=newHashSet<>();for(intnum:set1)tempSet.add(num);for(intnum:set2){if(tempSet.contains(num))intersectionSet.add(num);}returnintersectionSet.stream().mapToInt(Integer::intValue).toArray();}// 并集publicstaticint[]findUnion(int[]set1,int[]set2){Set<Integer>unionSet=newHashSet<>();for(intnum:set1)unionSet.add(num);for(intnum:set2)unionSet.add(num);returnunionSet.stream().mapToInt(Integer::intValue).toArray();}

💡 提示:可使用stream().mapToInt()简化数组转换(考试若限制 JDK 版本,可用传统循环)

📊 复杂度分析
操作时间复杂度空间复杂度
交集O(n + m)O(n)
并集O(n + m)O(n + m)

考点3:有序集合的交集与并集

📌 题目要求

两个非递减有序数组(可能含重复),求有序且无重复的交集与并集。

💡 实现思路
  • 核心算法:双指针法(无需额外空间)
  • 优势:利用有序性,避免使用 HashSet,空间复杂度 O(1)
✅ 完整代码
// 有序交集(去重)publicstaticint[]findSortedIntersection(int[]set1,int[]set2){List<Integer>res=newArrayList<>();inti=0,j=0;while(i<set1.length&&j<set2.length){if(set1[i]==set2[j]){if(res.isEmpty()||res.get(res.size()-1)!=set1[i]){res.add(set1[i]);}i++;j++;}elseif(set1[i]<set2[j]){i++;}else{j++;}}returnres.stream().mapToInt(Integer::intValue).toArray();}// 有序并集(去重)publicstaticint[]findSortedUnion(int[]set1,int[]set2){List<Integer>res=newArrayList<>();inti=0,j=0;while(i<set1.length&&j<set2.length){if(set1[i]<set2[j]){res.add(set1[i++]);}elseif(set1[i]>set2[j]){res.add(set2[j++]);}else{res.add(set1[i]);i++;j++;}}while(i<set1.length)res.add(set1[i++]);while(j<set2.length)res.add(set2[j++]);returnres.stream().mapToInt(Integer::intValue).toArray();}
🔥 期末高频考点
  • 有序交集必须去重:即使输入有重复,输出只能保留一次
  • 双指针移动逻辑:相等时同时移动,不等时移动较小者
  • 对比无序解法:有序解法空间更优(O(1) vs O(n))

考点4:字符数组拆分(数字/字母分类)

📌 题目要求

将数组{'1','g','3','4','e',...}拆分为数字字符数组字母字符数组,保持原顺序。

💡 实现思路
  1. 第一遍:统计数字和字母个数(确定结果数组长度)
  2. 第二遍:分别填充两个结果数组
  3. 注意:只处理'0'-'9''a'-'z'/'A'-'Z'
✅ 完整代码
publicstaticchar[][]splitArrayA(char[]arr){intnums=0,letters=0;for(charc:arr){if(c>='0'&&c<='9')nums++;elseif((c>='a'&&c<='z')||(c>='A'&&c<='Z'))letters++;}char[]numArr=newchar[nums];char[]letterArr=newchar[letters];intni=0,li=0;for(charc:arr){if(c>='0'&&c<='9'){numArr[ni++]=c;}elseif((c>='a'&&c<='z')||(c>='A'&&c<='Z')){letterArr[li++]=c;}}returnnewchar[][]{numArr,letterArr};}
⚠️ 易错点提醒
  • 字符判断范围写错(如漏掉大写字母)
  • 未先统计数量,直接创建固定长度数组 →数组越界
  • 存储指针未自增 → 元素被覆盖

考点5:有序数组去重(两种算法对比)

📌 题目要求

对非递减有序数组去重(保留唯一元素),实现两种不同复杂度的算法。

✅ 算法1:双指针法(推荐!)
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)(原地修改)
  • 适用:数组有序 + 要求空间优化
publicstaticint[]removeDuplicatesByTwoPointers(int[]arr){if(arr==null||arr.length<=1)returnarr;intslow=0;for(intfast=1;fast<arr.length;fast++){if(arr[fast]!=arr[slow]){arr[++slow]=arr[fast];}}returnArrays.copyOf(arr,slow+1);}
✅ 算法2:LinkedHashSet 法
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
  • 优点:代码简洁,自动去重 + 保序
publicstaticint[]removeDuplicatesByHashSet(int[]arr){Set<Integer>set=newLinkedHashSet<>();for(intx:arr)set.add(x);returnset.stream().mapToInt(Integer::intValue).toArray();}
📊 算法对比表
算法时间复杂度空间复杂度是否原地适用场景
双指针法O(n)O(1)有序数组、内存受限
HashSet 法O(n)O(n)无序也可用、追求开发效率

💡考试重点:理解“空间换时间” vs “时间换空间”的设计哲学!


三、期末复习总结

四大核心思想

  1. 有序性是优化关键:能用双指针就别用 HashSet
  2. 双指针是数组操作的万金油:合并、去重、交并集都能用
  3. 边界条件必检查:空数组、单元素、全重复等
  4. 复杂度要会分析:时间 vs 空间权衡是高频简答题

三大易错雷区

  • 数组越界(长度计算错误、指针未移动)
  • 忘记去重(尤其有序交集)
  • 字符判断逻辑不全(大小写、数字范围)

代码规范建议

  • 方法命名清晰(如mergeSortedArrays
  • 添加必要注释(考试阅卷加分项)
  • 处理null输入(体现健壮性)

四、完整测试代码(一键运行)

importjava.util.*;publicclassArrayFinalReview{publicstaticvoidmain(String[]args){System.out.println("===== 数组核心操作测试 =====");testMerge();System.out.println("------------------------------");testUnorderedSet();System.out.println("------------------------------");testSortedSet();System.out.println("------------------------------");testSplit();System.out.println("------------------------------");testRemoveDuplicates();}// 此处粘贴上述所有方法(略,实际使用时补全)}

结语
掌握这五大核心操作,你就已经覆盖了期末数组题型的 90%!建议动手敲一遍代码,理解每一步的逻辑,尤其是双指针的移动规则去重时机。祝大家期末稳过,高分上岸!🎉

📌关注我,获取更多数据结构 & 算法期末复习干货!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/15 3:05:43

本地微调大语言模型全攻略:从安装PyTorch到导入Ollama,一步步实践!

简介 本文详细介绍了本地微调大语言模型的全流程&#xff0c;包括安装PyTorch并检查GPU兼容性、安装LLaMAFactory、下载Qwen模型、准备数据集、使用LoRA技术进行微调&#xff08;包括unsloth优化&#xff09;、测试效果、转换为GGUF格式并导入Ollama。整个过程提供了详细的命令…

作者头像 李华
网站建设 2026/1/17 22:54:44

n8n与Coze对比分析,自动化工具选择攻略,建议收藏!

简介 本文详细对比了n8n和Coze两款自动化工具&#xff0c;n8n适合技术开发者处理复杂逻辑和系统集成&#xff0c;开源免费但技术门槛较高&#xff1b;Coze面向业务人员&#xff0c;无代码可视化但扩展性有限。企业可根据用户群体、流程复杂度、部署需求等选择合适工具&#xff…

作者头像 李华
网站建设 2026/1/1 16:58:54

AI美化PPT工具“内卷”升级:这款凭什么在2025脱颖而出?

制作PPT时&#xff0c;83%的用户曾因“排版耗时”“格式混乱”“专业度不足”等问题&#xff0c;最终放弃优化视觉呈现。进入2025年&#xff0c;AI美化工具已从“单一功能”向“全链路服务”升级。本次测评围绕技术架构、实用效率、场景适配三大核心维度&#xff0c;结合商务汇…

作者头像 李华
网站建设 2025/12/25 2:02:51

通过偏振光干涉生成空间变化的偏振

摘要 干涉测量是光学计量的重要技术。 例如&#xff0c;在VirtualLab Fusion中构建具有相干激光光源的马赫泽德干涉仪。 特别是在此示例中插入两个偏振片以控制两个干涉光束的偏振态。 通过旋转其中一个偏振器&#xff0c;可以达到干涉图案变化的可视化&#xff0c;最终产…

作者头像 李华
网站建设 2025/12/25 13:00:55

科学训练提升孩子学习能力

您是否也曾经历过这样的场景&#xff1f;孩子坐在书桌前&#xff0c;眼睛盯着课本&#xff0c;却一个字也看不进去。您在一旁焦急地催促&#xff0c;却换来孩子更加抵触的情绪。作业本上的错题越来越多&#xff0c;孩子的自信心一点点被消磨&#xff0c;而您内心的焦虑也在不断…

作者头像 李华
网站建设 2026/1/19 10:16:20

应用启动时间测试优化指南

1 启动时间测试指标体系构建 1.1 核心性能指标定义 应用启动时间测试需建立多层次测量体系&#xff1a; 冷启动&#xff1a;进程完全不存在时的启动过程&#xff0c;涵盖从用户点击图标到首帧完全绘制的完整周期 热启动&#xff1a;应用进程仍在后台时的启动过程&#xff0…

作者头像 李华