您的位置:首页 > 职场人生

面试题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));
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: