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<size;i=i+2){if(A[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<<Max<<endl;cout<<Min<<endl;
}

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

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

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

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

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<size;i++){excVal^=A[i];}int s1=1;int s2=excVal;while((s2&1)==0){s2>>=1;s1<<=1;}*first=excVal;for(int i=0;i<size;i++){ if(s1&A[i]) *first^=A[i];}*second=excVal^*first;
}void FindTwoNumTest()
{int A[12]={2,1,1,2,3,3,5,7,4,4,7,9};int first=0,second=0;FindTwoNum(A,12,&first,&second);cout<<first<<endl;cout<<second;
}

三道简单算法题(一)

三道简单算法题(二)相关推荐

  1. JAVA 判断简单密码算法_十道简单算法题二【Java实现】

    前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...

  2. 十道简单算法题二【Java实现】

    前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...

  3. 用python编写杨辉三角金字塔_用python实现三道简单算法题:杨辉三角,蛇形矩阵,金字塔...

    分享几道简单的python打印输出的问题,本质上都是可以将其分解成一个大循环之中有几个小循环. 1.杨辉三角 主要特点: 每个数等于它上方两数之和. 每行数字左右对称,由1开始逐渐变大. 每行端点与结 ...

  4. java的简单算法题_[2]十道算法题【Java实现】

    前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...

  5. 学习笔记之15道简单算法题

    15道简单算法题 http://www.cnblogs.com/hlxs/archive/2014/06/06/3772333.html (●-●) | 剑指Offer_编程题_牛客网 http:// ...

  6. LeetCode 简单算法题

    使用Nodejs 抓取的LeetCode 简单算法题  一步一步来,先攻破所有简单的题目,有些题目不适合使用JS解决,请自行斟酌 Letcode 简单题汇总 104. Maximum Depth of ...

  7. 来,做一道字节跳动面试的简单算法题

    面试大厂,算法基本是必面的,特别是字节跳动,技术面最后一个问题就是算法题,这次给大家带来一道字节跳动面试出的一道简单算法题. 请听题: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递 ...

  8. 简单算法题:leetcode-2 两数相加

    算法撸一遍,从简单的开始. 做leetcode题目的时候,经常百度答案,但感觉大多不是我想要的,很多我不能理解.现在也做了一些算法题,哪些并不是很深奥,但需要一些技巧,简单的算法题更多的是经验值.这里 ...

  9. 小学数学开灯问题_三道简单的小学二年级的数学题,一遍过全对的还不到一半...

    数学与工作.学习.生活息息相关,有时除了简单的运算,还需要结合生活中的常识. 下面三道小二年级的数学题,是某二年级数学老师出给自己班上学生的课堂练习,要求大家一遍过,不能修改.结果全对的还不到全班人数 ...

最新文章

  1. C#类方法中使用数组参数params关键字的作用
  2. Ios之label自适应里面的文字,自动调整宽度和高度的
  3. vue第二次ajax失效,解决VUE-Router 同一页面第二次进入不刷新的问题
  4. linux cp命令使用
  5. 1 echo();2 print();3 die();4 printf();5 sprintf();6 print_r();7 var_dump(); 区别
  6. Linux kill 多余用户终端
  7. android 发送按键 0,android monitor tool (8.0 模拟发送按键及触摸屏事件实现)
  8. zookeeper 阿里滴滴 有点用 zookeeper主从选举方式
  9. 网络信息安全常用术语
  10. 找茬小游戏微信小程序源码自带流量主功能+前端+后端+教程
  11. 编写一个JSP页面,实现根据一个人的18位身份证显示出生日的功能,要求把表达式声明和Scriptlet全部用到,并把结果显示在表格中
  12. php中的,理解php中的print EOT
  13. 10-门面模式Quarkus实现
  14. Error排错:container runtime network not ready
  15. 软件测试提交bug意思,软件测试bug定义及分类
  16. 王思聪 远程操控女主播“翻床”
  17. 将文件夹的分组方式应用到电脑的所有文件夹
  18. IDEA设置终端Terminal窗口字体和大小
  19. uniApp运行到微信小程序
  20. HTML如何实现带有滚动条的文本框

热门文章

  1. 中给函数赋读权限_sql动态传参在springData中的应用(补充)
  2. es中主分片和副本分片
  3. 第5章 set命令详解
  4. 照片解锁手机不能忍?教你用OpenCV做活体检测 | 有代码
  5. Dota2团战AI击败人类最全解析:能团又能gank,AI一日人间180年
  6. 从应届技术男到百度VP,这是低调到没百科的吴海锋首次受访
  7. 论PS的功力,英伟达的AI这次谁也不服
  8. 华为Mate10到底AI在哪?
  9. go 的基本数据类型
  10. 用习惯了windows系统要怎样去认识linux系统(三)