算法练习篇之:数组中重复的数字

  • 题目描述
  • 解题思路
  • 代码实现
  • 总结


题目描述

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

解题思路

题目意思很明确,我们需要判断一个数组中是否有重复的元素存在,并找出第一个重复出现的数字。题目没有对我们有额外的限制要求,我们设想有一种结构,一种映射关系,把数组中每个元素和对应的重复次数一 一对应起来,这个结构已经有了现成的框架,那就是哈希表!想到这里,题目可能就明朗许多了,我们只需对数组进行遍历,以每个数组元素,元素重复次数。在遍历查询中,判断某个数组元素是否存在,如果不存在,则放入HashMap中,对应值为1,否则放入HashMap中,并将对应值加1!

方法二、三均为通过在线测试的方案!

代码实现

去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

import java.util.HashMap;
//查找数组中是否有重复出现的元素
public class duplicateArray {
    public static boolean duplicate_1(int numbers[],int length,int[] duplicate){//HashMap
        if(length<2||numbers==null){
            return false;
        }
        HashMap<Integer,Integer> map = new HashMap<>();
        for (int i=0;i<length;i++){
            if(!map.containsKey(numbers[i])){
                map.put(numbers[i],1);
            }
            else {
                int num=map.get(numbers[i]);
                map.put(numbers[i],num+1);
                duplicate[0]=numbers[i];
                return true;

            }
        }
        return false;
    }

    public boolean duplicate_2(int numbers[],int length,int[] duplicate){
        //使用数组注册已遍历过的数字,当遍历的数字出现过,则找到重复数字
        if (numbers==null||numbers.length==0){
            return false;
        }
        int[] times=new int[numbers.length];
        for (int num:numbers){
            if (times[num]!=0){//times数组记录其下标对应数字出现次数
                duplicate[0]=num;
                return true;
            }
            times[num]++;
        }
        return false;
    }

    public boolean duplicate_3(int numbers[],int length,int[] duplicate){
        if (numbers==null||numbers.length==0){
            return false;
        }
        for (int i=0;i<length;i++){
            while (i!=numbers[i]){//注意while,其作用是在原地循环归位,将其他i归位到numbers[i]
                if (numbers[numbers[i]]==numbers[i]){
                    duplicate[0]=numbers[i];
                    return true;
                }else {
                    swap(numbers,i,numbers[i]);
                }
            }
        }
        return false;
    }

    public void swap(int[] arr,int a,int b){
        int temp=arr[a];
        arr[b]=arr[a];
        arr[a]=temp;
    }

    public static void main(String[] args) {
        int[] array={2,1,3,4,1,2};
        int[] duplicate=new int[1];
        boolean result=duplicate_1(array,array.length,duplicate);
        System.out.println("数组是否有重复:"+result);

    }
}

总结

本题来源于面试经典教材《剑指offer》中 归属于数组类型题目。
今后我会每星期更新三次,通过更新博客不断督促自己学习,同时可以锻炼自己算法能力!
同许多在算法道路上不断前行的人一样,不断练习,修炼自己!
如有博客中存在的疑问或者建议,可以在下方留言一起交流,感谢各位!
最后的最后,感谢Jerry算法!