# 面试 19:输出数组中出现次数超过一半的数字(剑指 Offer 26 题)
上一篇推文给大家留下的习题来自于《剑指 Offer》第 29 题:数组中超过一半的数字,不知道各位去思考了么?
> 面试题:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字并输出。比如 {1,2,3,2,2,2,1} 中 2 的次数是 4,数组长度为 7,所以输出 2。要求不能修改输入的数组。
## 准备测试用例
这道题能思考到的测试用例比较简单。
1. 输入符合条件的数组,查看打印是否满足情况;
2. 输入不符合条件的数组,查看打印;
3. 输入只有一个元素的数组,查看打印;
4. 输入无效数组,查看打印;
## 思考程序逻辑
第二步便是我们的思考程序逻辑了,题目要求查找出现次数超过一半的数字。比较容易想到的思路是直接对数组排序,那中间那个值就是我们想要的值,但这样的想法明显排序后会对输入的数组顺序有影响,所以我们可能需要换一种思路。
再看一遍题干,我们不难思考到,我们是否可以对每个数字进行计数,最后返回计数次数最多的值。存储次数采用 map 做映射处理。
```java
public class Test19 {
private static int moreThanHalfNums(int[] nums) {
if (nums == null || nums.length == 0)
throw new RuntimeException("the length of array must be large than 0");
int len = nums.length;
Map map = new HashMap<>();
for (int num : nums) {