【题目描述】在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。
【参数说明】 numbers: 输入的整数数组 length: 数组的长度 duplication: 输出任意一个重复的数字。使用duplication[0] 表示 public boolean duplicate(int numbers[],int length,int [] duplication) { }
【输出】 1. 如果存在重复的数字,返回值为true。并使用duplication[0]返回任意一个重复的数字。 2. 如果不存在重复的数字,返回false。
【解题思路1】 //1. 遍历数组,采用hashmap存放每个元素,其中元素作为key存储,value为0。 //2. 当前遍历元素插入hashmap时,先检查hashmap中是否已经存在同样的key。 //3. 若存在,记录下该值,返回true;若不存在,存入map中,继续遍历,直到数组结束,返回false.
public boolean duplicate(int numbers[],int length,int [] duplication) { boolean flag = false; if(numbers==null || length==0){ return flag; } HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); for(int num: numbers){ if(map.containsKey(num)){ flag = true; duplication[0] = num; break; } map.put(num, 0); } return flag; }【解题思路2】 //1. 注意到输入是长度为n的数组,所有数字都在0到n-1的范围内。可以利用原数组的特点设置标志。 //2. 当一个数字被访问到后,在其对应的位数上面进行-length的操作。 //3. 当下次访问到重复数值时,只需要检查对应的位数上面的值是否小于0,就可以判断该数字是否是重复出现。 //4. 该方法有一个缺点就是改变了原数组。
public boolean duplicate(int numbers[],int length,int [] duplication) { boolean flag = false; if(numbers==null || length==0){ return flag; } for(int i=0; i<length; i++){ int index = numbers[i]; if (index < 0){ index += length; } if(numbers[index] < 0){ //因为index<0时,有一个还原+length的操作,所以返回的就是原来的重复的数字 duplication[0] = index; flag = true; break; } numbers[index] -= length; } return flag; }【解题思路3】 //1. 利用字符串拼接每个元素。 //2. 判断字符串中同一个元素的子串,是否出现在了两个位置 //3. StringBuffer与String的不同之处在于,String每次拼接都会返回一个新的对象,而StringBuffer不会。
链接:https://www.nowcoder.com/questionTerminal/623a5ac0ea5b4e5f95552655361ae0a8 来源:牛客网 public boolean duplicate(int numbers[],int length,int [] duplication) { StringBuffer sb = new StringBuffer(); for(int i = 0; i < length; i++){ sb.append(numbers[i] + ""); } for(int j = 0; j < length; j++){ if(sb.indexOf(numbers[j]+"") != sb.lastIndexOf(numbers[j]+"")){ duplication[0] = numbers[j]; return true; } } return false; }