拓冰建站拓冰建站
首页 / 资讯中心 / 正文

【Java基础练习——有序数组去重(快慢指针解法)】

一、题目给定有序递增数组要求原空间内去除重复不新开数组最终输出不重复元素重复元素直接覆盖。示例数组{1122223333}最终保留 {123}运行环境说明VS CodeJava 17,本文件的类名是BasicGrammar。Java要求public类名要和文件名完全一致所以保存文件名是BasicGrammar.java,否则编译器会报错二、拆题用快慢指针思想1指针理解慢指针 slow指“当前最后一个不重复的数”slow 就停在上一个保留的数的位置等待接收新的不同数快指针 fast负责向前走去找新的不重复数2思路1.假设 slow从索引0第一个元素开始2. fast 从索引 1 第二个数开始遍历全部数3. 相等 fast跳过一个重复数不相等 slow 快指针的数据存入慢指 针 fast这块的顺序要注意4.遍历结束后[0 slow] 区间即为所得的无重复的数的集合三、完整可运行代码import java.util.Scanner;public class BasicGrammar{public static void main(String[] args){Scanner scnew Scanner(System.in);System.out.print(“请输入数组的长度”);int lensc.nextInt();int []arrnew int[len];System.out.println(“请输入有序数组的”len“个元素”);for(int i0;iarr.length;i){arr[i]sc.nextInt();}int fast1; int slow0; while(fastarr.length){ if(arr[slow]arr[fast]){ fast; }else{ slow; arr[slow]arr[fast]; fast; } } System.out.println(去重之后剩余有效元素); for(int i0;islow;i){ //这块限制范围是小于slow而不是小于arr.length,否则会输出原数组的信息而不是重新排布的不重复的信息 System.out.println(arr[i]); } sc.close(); }}输出结果四、遇到的问题问题1输出范围写成 arr.length错误后果数组只是前半段被覆盖后半段旧重复数据还在会输出 1 2 3 2 2 2 3 3 3 3 理解快慢指针去重没有删除数组元素只是把不重复元素往前覆盖有效长度 slow下标 1问题2顺序写反先赋值再slow错误后果会覆盖掉之前的合法数据第一个数据直接丢失整体错位。理解先 slow 腾出空位 再存新数据问题3slow、fast初始值写反slow1fast0slow 永远从 0保留第一个数fast 永远从 1开始往前走五、算法复杂度分析1)时间复杂度O(n)fast指针一次性遍历数组没有嵌套循环2)空间复杂度O(1)原地算法不开新数组极致优化六、QA1.为什么有序数组才能用快慢指针因为有序数组重复元素一定相邻fast只需要和前一个有效值对比即可.2.如果数组无序还能用这个方法吗不能需要借助 Set 去重空间复杂度会变成 O(n).HashSet需要分配额外内存HashSet不维护内存空间用LinkedHashSet可保留原数据的顺序3.为什么最终有效长度是 slow1因为数组下标从0开始slow是最后一个有效下标元素个数 slow1.本题虽然属于入门级题目边界条件却存在坑点是为个人学习Java记录如有问题欢迎各位大佬批评指正
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门