Java算法 空间换时间(找重复)

一、算法示例
1、题目:题目:0-999的数组中,添加一个重复的元素,打乱后,找出这个重复元素
代码示例:

package com.zw.study.algorithm;
import java.util.*;
public class XorTest {

    public static void main(String[] args) {
        // 生成一个0-100的101位固定数组,之后对下标为100的值重新生成重复的随机数
        Integer[] arr = new Integer[1001];
        for (int x = 0; x < arr.length; x++) {
            arr[x] = x;
        }
        Random r = new Random();
        arr[1000] = r.nextInt(1000);   // 0-99的随机数
        System.out.println("生成的随机数是:" + arr[1000]);

        // 顺序打乱
        List<Integer> arrList = new ArrayList<>();
        arrList.addAll(Arrays.asList(arr));
        Collections.shuffle(arrList);
        arr = arrList.toArray(new Integer[0]);
        System.out.println();

        spaceIndexMethod(arr);
    }

     // 空间换时间算法
    private static void spaceIndexMethod(Integer[] arr) {
        long startTime = System.nanoTime();
        // 空间换时间
        int[] newArray = new int[1001];
        int result = -1;
        for (int x = 0; x < arr.length; x++) {
            newArray[arr[x]]++;
            if(newArray[arr[x]] == 2) {
                result = arr[x];
                break;
            }
        }
        System.out.println("这个重复的元素是:"+result);
        long endTime = System.nanoTime();
        System.out.println("空间算法共耗时:" + (endTime - startTime) + "纳秒");
    }
}

运行结果:
在这里插入图片描述
说明:
空间换时间算法,是算法中最常见的一种,以牺牲一定空间为代价,换得时间的耗时更少。
1000个数据可能不好理解,以5个数据说明给大家理解一下上面的原理:
原始数据:0 1 2 3 4
添加重复元素后:0 1 2 3 4 2
打乱后如:3 2 1 4 2 0
生成空间数组0 0 0 0 0 实际上就是记录重复值出现的次数(第1个记录0的出现次数,第2个记录1的出现次数,第3个记录2的出现次数…)
如下图可以看到,因为出现了两次2,就会在新数组的第3个位置进行两次自增,而不重复的值,只会在自己值对应的下标处自增1次。所以可以新数组值为2的地方,下标就是数组1中的重复值。
在这里插入图片描述

学海无涯苦作舟!!!

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值