题目
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1、2、3、2、2、2、5、4、2},由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
思考
- hashmap 法
此法思路简单,可以使用hashmap 记录当前的数字和他出现的次数
但是重点在于 遍历整个map,找到符合条件的值
2。 消去法
既然它出现的次数 大于 数组的长度的一半,那么 假设 定义 一个index ,出现了一个 其他数字,index-1;出现一次目标数字 ,index 加一 当index ==0时,将目标数字进行替换,最后即可找到
代码实现
1.hashmap
public int find(int [] x) {
/*构造一个hashmap,key为元素的值,value为元素出现的次数,然后遍历hashmap就可以找到目标元素了。
* 时间复杂度O(n),空间复杂度为O(n)
*/
int length = x.length/2;
HashMap map =new HashMap();
//首先遍历 数组,初始化 map key 为 数字 value 为 出现的次数
for(int i=0;i<x.length;i++) {
if(map.containsKey(x[i])) {
int temp=(int) map.get(x[i]);
temp++;
map.put(x[i], temp);
}
else {
map.put(x[i], 1);
}
}
//遍历 map
Set<Map.Entry> es = map.entrySet();
Iterator<Map.Entry> it = es.iterator();
while (it.hasNext()) {
// 返回的是封装了key和value对象的Map.Entry对象
Map.Entry en = it.next();
// 获取Map.Entry对象中封装的key和value对象
int key = (int) en.getKey();
int value = (int) en.getValue();
if(value > length ) {
System.out.println("key=" + key + " value=" + value);
break;
}
}
return 0;
}
2.消去法
public int find2(int [] x) {//消去法
int result = -1;
int times = 0;
for(int i=0;i<x.length;i++) {
if(times==0) {
//记录 当下个结果点
result= x[i];
times =1;
}
else {
if(result==x[i]) {
times++;
}
else {
times --;
}
}
}
return result;
}