算法练习篇之:数组中重复的数字
- 题目描述
- 解题思路
- 代码实现
- 总结
题目描述
在一个长度为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算法!