* 题目内容:
* 给定一个大小为 n 的数组,找到其中的多数元素。
* 多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
* 你可以假设数组是非空的,并且给定的数组总是存在多数元素。
* 示例 1:
* 输入:[3,2,3] -> [2,3,3]
* 输出:3
* 示例 2:
* 输入:[2,2,1,1,1,2,2] -> [1,1,1,2,2,2,2]
* 输出:2
题目分析:
1,在数组中找多数元素就是找众数,一般当数组元素排序后
众数是中间的元素
2,或者使用哈希表方法,映射存储出现的元素和该元素出现的次数
代码如下:
(1)一般方法
import java.util.Arrays;
public class Test{
public static void main(String[] args) {
int[] arr =new int[]{2,2,1,1,1,2,2};
System.out.println( "这个数组的众数是:" + manyNum(arr));
}
public static int manyNum(int[] arr){
//JDK已有排序方法
Arrays.sort(arr);
return (arr[arr.length /2]);
}
}
(2)哈希表方法
步骤;
1.产生对象
HashMap<Inteder,Integer> map = new HashMap<>();
2.设置内容
key 值唯一,不能重复,value可重复
map.put(key,value);
3.取得内容,取得key值对应的value
map.get(key);
4.遍历
Set<Map.Entry<Integer,Integer>> set = map.entrySet();
for(Map.Entry<Integer,Integer>entry:set){}
代码如下:
public static int manyNum(int[] arr) {
HashMap<Integer, Integer> map = new HastMap<>();
//遍历数组将不重复元素以及出现次数存在映射中
for (int i = 0; i < arr.length; i++) {
//此时映射存在元素
if (map.containsKey(arr[i])) {
//将出现次数+1
int value = map.get(arr[i]);
map.put(arr[i], value + 1);
} else {
//此时映射还没有该元素
map.put(arr[i], 1);//HashMap表中存储方法put(不重复的元素,value)
}
}
//在数据集查找出现次数> n/2的元素
//哈希表的遍历
Set<Map.Entry<Integer, Integer>> set = map.entrySet();
for (Map.Entry<Integer, Integer> entry : set) {
//取出每个元素的value值
if (entry.getVlaue() > arr.length / 2) {
return entry.getKey();
}
}
return -1;
}