Agent Vibes:为AI编程工具打造的统一代理网关,实现多后端智能路由
2026/5/12 14:54:14
前言
在数据结构期末考试中,数组作为最基础、最常考的数据结构之一,其核心操作是高频考点。本文系统梳理了五大经典数组操作题型——合并、交并集、拆分、去重等,结合实验场景,提供完整 Java 代码实现、时间/空间复杂度分析及易错点提醒,助你高效备考,稳拿高分!
将两个非递减有序数组合并为一个新的非递减有序数组,要求时间复杂度最优。
O(n + m)i,j和结果指针kpublicstaticint[]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)给定两个可能含重复元素的无序数组,求交集(共同元素)和并集(所有元素去重)。
HashSet(自动去重 + O(1) 查询)// 交集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) |
两个非递减有序数组(可能含重复),求有序且无重复的交集与并集。
// 有序交集(去重)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();}将数组{'1','g','3','4','e',...}拆分为数字字符数组和字母字符数组,保持原顺序。
'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};}对非递减有序数组去重(保留唯一元素),实现两种不同复杂度的算法。
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);}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 “时间换空间”的设计哲学!
✅四大核心思想:
✅三大易错雷区:
✅代码规范建议:
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%!建议动手敲一遍代码,理解每一步的逻辑,尤其是双指针的移动规则和去重时机。祝大家期末稳过,高分上岸!🎉
📌关注我,获取更多数据结构 & 算法期末复习干货!