面试题29:数组中出现次数超过一半的数字
2015-07-02 22:18
302 查看
/*面试题29:数组中出现次数超过一半的数字 *题目:数组中有一个数字的出现次数超过了数组长度的一半,找出这个数字。 *常规的算法是先对数组排序,排序的时间复杂度是O(nlogn)。 *不需要改变数组的O(n)的算法。在遍历数组的时候保存两个值:数组中的数字和次数。当遍历到下一个数字时, *如果和之前保存的数字相同,次数加1;不同则次数减1.次数为0,则保存下一个数字并把次数设为1.我们要找 *的数字就是最后一次把次数设为1的数字。 */ public class moreThanHalfNUm { public static int MoreThanHalfNum(int[] numbers) { if(numbers==null||numbers.length<=0) return 0; int result=numbers[0]; int times=1; for(int i=0;i<numbers.length;++i) { if(times==0) { result=numbers[i]; times=1; } else if(numbers[i]==result) times++; else times--; } if(!CheckMoreThanHalf(numbers,result)) result=0; return result; } //判读超过一半的数是否存在 public static boolean CheckMoreThanHalf(int[] numbers,int number) { int times=0; for(int i=0;i<numbers.length;++i) { if(numbers[i]==number) times++; } boolean isMoreThanHalf=true; if(times*2<=numbers.length) isMoreThanHalf=false; return isMoreThanHalf; } public static void main(String[] args) { // TODO Auto-generated method stub int[] a1 = {1,2,3,4,5,6,1,1,1,1,1}; int[] a2 = {1,2,3,4,5,6,7,3,4}; int[] a3=null; int[] a4={1}; System.out.println(MoreThanHalfNum(a1)); System.out.println(MoreThanHalfNum(a2)); System.out.println(MoreThanHalfNum(a3)); System.out.println(MoreThanHalfNum(a4)); } }
相关文章推荐
- 黑马程序员-java基础-反射
- 黑马程序员——static关键字
- 面试题7,用两个栈实现队列
- 黑马程序员----OC学习之NSDictionary及NSMutableDictionary
- J2EE修炼之四书五经[转自2004年程序员]
- BAT内部级别和薪资待遇 | 职业发展
- 程序员保值的4个秘密
- 黑马程序员——Java基础--集合(二)
- 黑马程序员——Java基础--集合(一)
- 【剑指offer】面试题26:复制的复杂链条
- Net基础面试题
- 菜鸟程序员的在CSDN中的开篇
- 硅谷科技巨头最刁钻面试题集锦
- 【剑指offer】面试题21:包含min函数的栈
- 黑马程序员——自增和自减运算符
- 黑马程序员————Java基础日常笔记---对集合的理解与总结一
- 【Web探索之旅】第四部分:Web程序员
- Hadoop面试题集锦
- 字符串面试题(一)字符串逆序
- 【黑马程序员】Java学习笔记之继承(一)(面向对象)