面试题29数组中出现次数超过一半的数字
2015-08-27 14:31
615 查看
面试题29数组中出现次数超过一半的数字:
思路:最直观的思路就是对数组进行排序然后取中位数。时间复杂度取决于排序算法。或用Partition()函数找一个枢纽元素将数组分为两部分一部分比枢纽元素小,另一部分比枢纽元素大且枢纽元素的位置要在数组的中位数。
新颖的想法:利用数组的特点,顺序遍历数组的时候保存两个值一个数组中的数字一个是该数字出现的次数若数字相同则次数加1
数字不同则次数减一
注意点:函数的入参检查以及是否有元素出现次数超过数组元素的一半。
函数接口:bool CheckMoreThanHalf(int *a,int length,int value);
int MoreThanHalf(int *a,int length);
思路:最直观的思路就是对数组进行排序然后取中位数。时间复杂度取决于排序算法。或用Partition()函数找一个枢纽元素将数组分为两部分一部分比枢纽元素小,另一部分比枢纽元素大且枢纽元素的位置要在数组的中位数。
新颖的想法:利用数组的特点,顺序遍历数组的时候保存两个值一个数组中的数字一个是该数字出现的次数若数字相同则次数加1
数字不同则次数减一
注意点:函数的入参检查以及是否有元素出现次数超过数组元素的一半。
函数接口:bool CheckMoreThanHalf(int *a,int length,int value);
int MoreThanHalf(int *a,int length);
#include<iostream> #include<cstdlib> #include<cstdio> using namespace std; //面试题29数组中出现次数超过一半的数字 :思路 :最直观的思路就是对数组进行排序然后取中位数。时间复杂度取决于排序算法。或用Partition()函数找一个枢纽元素将数组分为两部分一部分比枢纽元素小,另一部分比枢纽元素大且枢纽元素的位置要在数组的中位数。 //创新的想法:利用数组的特点,顺序遍历数组的时候保存两个值一个数组中的数字一个是该数字出现的次数若数字相同则次数加1 数字不同则次数减一 //注意点:函数的入参检查以及是否有元素出现次数超过数组元素的一半。 bool InvalidInput=false; bool CheckMoreThanHalf(int *a,int length,int value)//检查value 在数组中有没有出现一半; { int count=0; for(int i=0;i<length;i++) { if(a[i]==value) { count++; } } if(count*2<=length) { InvalidInput=true; return false; } return true; } //比较新颖的解法 int MoreThanHalfNumber2(int *a,int length) { if(a==NULL||length<=0) { InvalidInput=true; return -1; } int result=a[0]; int count=1;//出现的次数 for(int i=1;i<length;i++) { if(count==0) { result=a[i]; count=1; } else if(a[i]==result) { count++; } else { count--; } } if(!CheckMoreThanHalf(a,length,result)) { InvalidInput=true; return -1; } return result; } int Partition(int *a ,int start,int end) { int i=start,j=end; int key=a[i]; while(i<j) { while(i<j&&a[j]>=key) { j--; } if(i<j) { a[i]=a[j]; i++; } while(i<j&&a[i]<=key) { i++; } if(i<j) { a[j]=a[i]; j--; } } a[i]=a[j]; return i; } //方法一 Partition() 方法 int MoreThanHalfNumber(int *a,int length) { if(a==NULL||length<=0) { InvalidInput=true; return -1; } int start=0, end=length-1; int index=Partition(a,start,end); int midIndex=length>>1; while(index!=midIndex) { if(index<midIndex) { start=index+1; index=Partition(a,start,end); } else if(index>midIndex) { end=index-1; index=Partition(a,start,end); } } if(!CheckMoreThanHalf(a,length,a[index])) { InvalidInput=true; return -1; } return a[index]; } int main() { int a[]={1,2,3,2,2,2,5,4,2}; int length=sizeof(a)/sizeof(a[0]); int result1=MoreThanHalfNumber(a,length); if(!InvalidInput) { cout<<"数组中出现一半的数字为:"<<result1<<endl; } int result2=MoreThanHalfNumber2(a,length); if(!InvalidInput) { cout<<"数组中出现一半的数字为:"<<result2<<endl; } return 0; }
相关文章推荐
- 程序员面试笔试宝典——读书笔记1、程序设计基础知识
- 黑马程序员——java基础 集合 (复习)
- 程序员为何对苹果 Mac 情有独钟?
- 给程序员推荐一些提高工作效率的工具
- 【原创分享】动态新增行和删除行
- Java面试--io
- 杭州地区IT公司招聘分析与求职建议
- 程序员为何对苹果 Mac 情有独钟?
- 读程序员的自我修养应该弄懂的问题
- php代码优化,mysql语句优化,面试需要用到的
- 黑马程序员—————Java基础--------IO流
- 职场规划从“试错”开始
- 面试题:查询连续出现的数字
- 最老程序员创业开发实训3---采用MVC架构的应用Splash页面实现
- 面试题:分数排名
- 黑马程序员——java基础——Java集合中TreeSet实现元素唯一性的方法
- 机器学习算法面试口述(7):分类小结
- 金融高富帅PK金融民工——职业规划方法论
- 风靡职场的十大面试题!
- 黑马程序员——java基础——Java中对字符串的操作