博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三道简单算法题(二)
阅读量:6688 次
发布时间:2019-06-25

本文共 1856 字,大约阅读时间需要 6 分钟。

1:试着用最少的比较次数去寻找数组中的最大值和最小值。

思路一:扫描数组两次,第一次等到最大值,第二次等到最小值。总共比较次数2N,这是大家都可以想到的。

思路二:定义两个变量存放最大值和最小值,将数组两两分组,两两进行比较,大的和最大值进行比较,小的和最小值比较,数组两两比较次数是N/2,分别与最大值和最小值比较的次数为N,总共比较次数1.5N。好久没写算法了,于是蛋疼得想实现一下。

//1:试着用最少的比较次数去寻找数组中的最大值和最小值。 void FindMaxMin(int *A,int size,int* Max,int* Min){     int i=(size & 1)?1:0;    *Max=*Min=A[0];     for(;i
A[i+1]) { if(A[i]>*Max) *Max=A[i]; if(A[i+1]<*Min) *Min=A[i+1]; }else{ if(A[i+1]>*Max) *Max=A[i+1]; if(A[i]<*Min) *Min=A[i]; } } }void FindMaxMinTest(){ int A[9]={
2,4,6,8,9,1,3,5,7}; int Max=0; int Min=0; FindMaxMin(A,9,&Max,&Min); cout<
<

写完之后,发现这太简单了,不过瘾,于是又实现了两题,当然这三道题的思路都很早之前就看过。

2:给一个整数数组,求数组中重复出现次数大于数组总个数一半的数

按照抵消的思路,如果存在一个数出现的次数大于数组的一半,将这个数与其他不同的数进行一一抵消,最后剩下的必定就是这个数,然后再验证这个数是否是真的出现次数超过数组的一半,实现如下,以前也实现过,但是发现这次的实现和以前的实现出入较大,这是为什么呢?

//2:给一个整数数组,求数组中重复出现次数大于数组总个数一半的数int MoreThanHalf(int *A,int size){     int num=A[0];    int count=1;    for(int i=1;i
(size/2)? num:-1;}void MoreThanHalfTest(){ int A[9]={ 1, 1,2, 1, 2, 2, 1, 2, 2 }; cout<

 

3:给一个很大的数组,里面有两个数只出现过一次,其他数都出现过两次,把这两个数找出来

按照异或运算的思路解题。假设这两个数分别为A,B;将数组的每个元素异或运算一次,得到这两个数的异或运算结果C,因为其他的数都是两两出现,异或运算的值为0,这个结果值C的二进制位中为1的位必只有A,B其中一个数有,因为异或运算就是不同的值才能得到1,相同的为0。即1&1=0;0&0=0;1&0=1。那么我们就可以随便从结果C中取出一个二进制位为1的位与其后面的0得到一个数,若结果C的二进制位后8位为00010100,那么我们就可以得到4(二进制100),然后将数组中的每一个与4进行异或运算,这样我们就能将数组分为两组,A,B就被分到不同的组,其他的数被分到那个组并不用管,因为经过异或运算之后的值都为0,将两组分别就行以后运算之后就能得到A,B的值了,其他的数都互相抵消了。

//3:给一个很大的数组,里面有两个数只出现过一次,其他数都出现过两次,把这两个数找出来void FindTwoNum(int* A,int size, int* first,int* second){    int excVal=A[0];    for(int i=1;i
>=1; s1<<=1; } *first=excVal; for(int i=0;i

转载于:https://www.cnblogs.com/hlxs/archive/2013/03/28/2986191.html

你可能感兴趣的文章
利用Segue在视图控制器间传值的问题
查看>>
发动机存隐患 现代起亚宣布在美召回16.8万辆车
查看>>
最前线|VIPKID正寻求4-5亿美元新一轮融资,估值达60亿美元
查看>>
文 OR 理?答案都在这里!
查看>>
XML+JSON面试题都在这里
查看>>
教你如何攻克Kotlin中泛型型变的难点(实践篇)
查看>>
2018Android面试经历
查看>>
不受限对抗样本挑战赛介绍
查看>>
浅解前端必须掌握的算法(三):直接插入排序
查看>>
[译] TensorFlow 教程 #06 - CIFAR-10
查看>>
阅读SSH的ERP项目【第二篇】
查看>>
如何有效的避免OOM,温故Java中的引用
查看>>
NSHipster: NSRegularExpression 中文版
查看>>
Android 开发中不得不知道的 Tips 集合 (持续更新 ing)
查看>>
报警系统QuickAlarm之报警规则的设定与加载
查看>>
【CLI】使用 Curl 下载文件实时进度条显示
查看>>
Android 滤镜效果和颜色通道过滤
查看>>
Ruby开发者已可通过Fog管理Microsoft Azure服务
查看>>
Chrome和HTTPS:安全Web的征途
查看>>
软件专家的对话模式(第一部分)
查看>>