数组去重-哈希-快慢指针

数组去重的方式有多种,下面介绍两种

  • 待操作数组用 数组a 表示
  • 处理好的数组用 数组res 表示
  1. Hash 哈希去重

思路:

  1. 利用Map不能存储相同数值的原理
  2. 取得所有键值存入数组,即去重后的返回值
public static int[] delSame(int[] a){
	Map<Integer,Integer> map = new HashMap<>();
        for (int num:a) {
            map.put(num,1);
        }
        Set<Integer> set = map.keySet();
        int[] res=new int[map.size()];
        Iterator<Integer> iterator = set.iterator();
        int i=-1;
        while (iterator.hasNext()){
            res[++i]=iterator.next();
        }
        return res;
}
  1. 快慢指针去重

思路:

  1. 对数组进行排序
  2. 借助快慢指针 i 和 j ,让 i 始终指向不重复的数据的下标作为慢指针,让 j 一直遍历数组,寻找重复的数值
  3. 找到重复的数值就让 j++ 跳过

完整代码:

public static int[] delSame(int[] a){
        //1.排序
        Arrays.sort(a);
        //2.去重
        int n=a.length;
        int[] res=new int[n];   //存放返回值,即去重后的数组
        if(n==1){   //极端案例
            res[0]=a[0];
            return res;
        }
        int i=0;    //慢指针
        int j=0;    //快指针
        int temp=-1;
        int num1 = a[i];    //指针i指向的值
        int num2 = a[j];    //指针j指向的值
        while (j<n) {   //只要j不越界就一直执行,但由于循环体中有多个++j,所以循环体内也应该判断以防越界
            res[++temp]=num1;	//每循环一次num1更新一次且不是重复值
            //防止越界
            int t = j+1;
            if(t==n){
                break;
            }
            num2 = a[++j];  //更新 j
            while(num2 == num1){//如果重复就让j++
                if(j==n-1){     //防止越界
                    break;
                }
                num2=a[++j];
            }
            num1=a[j];
        }
        int size = temp+1;  //发现去重后的数组大小 size=temp+1
        int[] ans = new int[size];
        for (int k = 0; k < size; k++) {
            ans[k]=res[k];
        }
        return ans;
    }

看似复杂,主要是判断越界的地方影响思维
核心代码:

while(j<n){
	res(++temp)=num1;
	num2=a[++j];
	while(num1==num2){
		num2=a[++j];
	}
	num1=num2;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让线程再跑一会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值