【追求进步】数组中出现次数超过一半的数字
2016-04-01 11:33
260 查看
属于基本典型的题目,编程的代码必须都掌握必须能够写出来!
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。在线代码:
public class Solution { public int MoreThanHalfNum_Solution(int [] array) { //第一种思路就是基于Partition的划分,根据数组的特性,排序之后可以知道数组中位数即就是大于数组一半的数字 int length=array.length; //边界处理 if(array==null||length<=0){ return 0; } int middle=length>>1; int start=0; int end=length-1; int index=Partition(array,length,start,end); while(index!=middle){ //找划分是否等于中位数 if(index>middle){ //划分的数字在数组中位数的右边 end=index-1; //则缩小右边的距离,右边的end向前移动 index=Partition(array,length,start,end); }else{ start=index+1; index=Partition(array,length,start,end); } } int result=array[middle]; if(!CheckMoreThanHalf(array,length,result)){ result=0; } return result; } public int Partition(int data[],int length,int start,int end){ if(data==null||length<=0||start<0||end>=length){ return -1; } int index=data[start]; while(start<end){ while(start<end&&data[end]>=index) end--; swap(data,start,end); while(start<end &&data[start]<=index) start++; swap(data,start,end); } return start; } public boolean CheckMoreThanHalf(int [] array,int length,int number){//检查是否超过数组一半 int times=0; for(int i=0;i<length;i++){ if(array[i]==number){ times++; } } boolean isMoreThanHalf=true; if(times*2<=length){ //这里写错了,简直就是坑,唉自己怎么那么不仔细, isMoreThanHalf=false; } return isMoreThanHalf; } public void swap(int[] c,int a,int b){ int temp=c[a]; c[a]=c[b]; c[b]=temp; } }
相关文章推荐
- HTML5 解决表单输入提示 placeholder 属性
- itmo论坛项目总结
- Android 上传文件
- [IMX6DL]Linux内核 --- 中断流程小结
- iOS删除子视图
- Linux内核在S3C2410平台上移植
- 创业一年,苟且偷生
- 冒泡排序BubbleSort
- 四则运算网页版
- java编程思想读书笔记三(11-21)
- IOS Animation-Sprite Kit(一)基础
- 语言的开始
- 【宝藏】题解(五校联考3day1)
- getClientRects 和 getBoundingClientRect 的用法和区别
- 如何在三个月内获得三年的工作经验(转载)
- 《开源安全运维平台-OSSIM最佳实践》喜获清华、北大、国家图书馆等国内一流大学图书馆收藏
- iOS 开发: 用户名、邮箱、电话号码、密码、昵称正则表达式验证
- js 排序
- Android Dalvik虚拟机初识
- Install Seafile Secure Cloud Storage on CentOS 7