剑指offer(30):数组中出现次数超过一半的数字
来源:互联网 发布:翼支付企业版下载软件 编辑:程序博客网 时间:2024/06/07 10:57
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
分析
数组中出现次数超过数组长度的一半,那它出现的次数比其他所有数字出现的总次数还要多。考虑在遍历数组时设置2个变量:1个是数组中的数字,1个是次数。遍历到下一个数字是,如果下一个数字与之前保存的数字相同,则次数加1;否则,次数减1。当次数减为0时,需要保存新的数字,并将次数重新设置为1。按照这种方法,最后一次把次数设置为1时对应的数字一定是出现次数超过一半的数字。
牛客AC代码:
/** * 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 * 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。 * 由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 * * key: 该数字出现的次数比其他所有数字出现的次数之和还要多; * 遍历时记录次数,如果下一个数字和当前相同,次数+1,否则次数-1,当次数归零时,记录 * 下一个数字,重复操作,最后一次把次数设为1时对应的数字即为目标; * * @param arr * @return */ public static int findNum(int[] arr) { if(arr == null || arr.length == 0) return 0; // 查找出现次数最多的 int length = arr.length; int num = arr[0]; int times = 1; for(int i = arr[1]; i < length; i++) { if(times == 0) { num = arr[i]; times = 1; } else if(num == arr[i]) { times++; } else { times--; } } // 数组中出现频率最高的数字都没有超过一半,则没有符合条件的。 // 判断该数字出现次数是否超过数组一半,否则,没有符合条件的 times = 0; for(int i = 0; i < length; i++) { if(num == arr[i]) times++; } if(times * 2 < length) num = 0; return num;}
参考
1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社
0 0
- 剑指offer--数组中出现次数超过一半的数字
- 《剑指offer》数组中出现次数超过一半的数字
- 剑指offer:数组中出现次数超过一半的数字
- 【剑指Offer】数组中出现次数超过一半的数字
- 剑指offer:数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字||剑指offer
- 剑指offer 数组中出现次数超过一半的数字
- 剑指offer:数组中出现次数超过一半的数字
- [剑指offer]数组中出现次数超过一半的数字
- 《剑指offer》-数组中出现次数超过一半的数字
- 剑指offer|数组中出现次数超过一半的数字
- 剑指offer-数组中出现次数超过一半的数字
- 《剑指offer》数组中出现次数超过一半的数字
- 剑指offer - 数组中出现次数超过一半的数字
- 剑指Offer:数组中出现次数超过一半的数字
- 剑指offer-数组中出现次数超过一半的数字
- 剑指offer:数组中出现次数超过一半的数字
- 剑指offer 数组中出现次数超过一半的数字
- 线程
- Nexus私服详细配置----学习笔记
- 深入解析代码重构
- Tricks(四十四)—— 双层循环变为单层索引
- 解决Android帧动画在Oncreate中启动只显示第一帧
- 剑指offer(30):数组中出现次数超过一半的数字
- 多核并行计算——学习总结
- @SuppressLint("NewApi")和@TargetApi()的区别
- Android中Touch事件的总结
- Android 底部导航与Fragment联动的实现
- ViewGroup中的控件点击不灵敏的问题
- 云之遥--素数
- Activiti-Explorer 用户名与密码
- 给 App 提速:Android 性能优化总结