Java实现查找出数组中重复的数字

题目描述: 找出数组中重复的数字

在一个长度为n的数组里的所有数字都在 0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如:如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出的是重复的数字2或者3

先考虑测试案例
1、是否存在非法数字,即存在超出n大小的数字或者是小于0的数字
2、数组是否为空或者长度为0

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 5; i++ ){
            list.add(sc.nextInt());
        }
        System.out.println(list);
        getSameNum(list);
    }
/**
*根据Hash值进行比较,且 获取到所有的重复数字
**/
    public static void getSameNum(List<Integer> list){
        try {
            if (null == list || list.size() == 0){
                throw new Exception("数组为空!");
            }
            Map<Integer,Integer> map = new HashMap<>();
            list.stream().forEach(i->{
                if (i < 0 || i > list.size()){
                    try {
                        throw new Exception("存在非法数字!");
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                        return;
                    }
                }
                if (map.containsKey(i)){
                    map.put(i,map.get(i)+1);
                }else{
                    map.put(i,1);
                }
            });
            Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
            Collection<Integer> collection = map.values();
            //将所有只重复一次的数字重新写到一个数组中,如果与原来的长度相同说明没有重复的数字
            List<Integer> collect = collection.stream().filter(i -> i == 1).collect(Collectors.toList());
            if (collection.size() == collect.size()){
                throw new Exception("不存在重复的数字!");
            }
            while (iterator.hasNext()){
                Map.Entry<Integer, Integer> next = iterator.next();
                Integer value = next.getValue();
                Integer key = next.getKey();
                if (value > 1){
                    System.out.println("数字"+key +"重复了"+value+"次");
                    //return; 如果只需一个值的话直接return即可
                }
            }
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }

测试
正常测试
Java实现查找出数组中重复的数字_第1张图片
存在小于0或者大于数组长度的案例
Java实现查找出数组中重复的数字_第2张图片
Java实现查找出数组中重复的数字_第3张图片

方法2

从头到尾依次扫描数组中的每个数字

  1. 当扫描到下表为i的数字时,首先比较这个数字(用m表示)是不是等于下标i;
  2. 如果是,则接着扫描下一个数字;如果不是,则再拿它和第m个数字进行比较。
  3. 如果它和第m个数字相等,就找到了一个重复的数字(也就是下标 i 和下标 m 的位置都出现了)
  4. 如果它和第m个位置数字不相等,就把第i个数字和第 m 个数字交换。
  5. 接下来我们再重复这个比较、交换的过程,知道我们发现一个重复的数字。
    public static void getSameNum1(List<Integer> list){
        try {
            if (null == list || list.size() ==0){
                throw new Exception("数组不能为空!");
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        for (int i = 0; i < list.size(); i++) {
            try {
                if (list.get(i)<0 || list.get(i)>list.size()){
                    throw new Exception("存在非法数字!");
                }
                if (i == list.get(i)){
                    continue;
                }else{
                    //如果下标i上的值不为i为v,那么先将v放到下标为v,再将下标为v的值存放在i
                    Integer v = list.get(i);
                    Integer v1 = list.get(v);
                    if (v == v1 ){
                        throw  new Exception("重复的数字为"+v);
                    }
                    list.set(v,v);
                    list.set(i,v1);
                }
            }catch (Exception e) {
                System.out.println(e.getMessage());
                return;
            }
        }
    }

测试
正常输出,检测到一个重复的数字就结束
Java实现查找出数组中重复的数字_第4张图片
存在非法数字
Java实现查找出数组中重复的数字_第5张图片

你可能感兴趣的:(算法总结)