三道简单算法题(二)
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; }
三道简单算法题(一)
三道简单算法题(二)相关推荐
- JAVA 判断简单密码算法_十道简单算法题二【Java实现】
前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...
- 十道简单算法题二【Java实现】
前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...
- 用python编写杨辉三角金字塔_用python实现三道简单算法题:杨辉三角,蛇形矩阵,金字塔...
分享几道简单的python打印输出的问题,本质上都是可以将其分解成一个大循环之中有几个小循环. 1.杨辉三角 主要特点: 每个数等于它上方两数之和. 每行数字左右对称,由1开始逐渐变大. 每行端点与结 ...
- java的简单算法题_[2]十道算法题【Java实现】
前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下, ...
- 学习笔记之15道简单算法题
15道简单算法题 http://www.cnblogs.com/hlxs/archive/2014/06/06/3772333.html (●-●) | 剑指Offer_编程题_牛客网 http:// ...
- LeetCode 简单算法题
使用Nodejs 抓取的LeetCode 简单算法题 一步一步来,先攻破所有简单的题目,有些题目不适合使用JS解决,请自行斟酌 Letcode 简单题汇总 104. Maximum Depth of ...
- 来,做一道字节跳动面试的简单算法题
面试大厂,算法基本是必面的,特别是字节跳动,技术面最后一个问题就是算法题,这次给大家带来一道字节跳动面试出的一道简单算法题. 请听题: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递 ...
- 简单算法题:leetcode-2 两数相加
算法撸一遍,从简单的开始. 做leetcode题目的时候,经常百度答案,但感觉大多不是我想要的,很多我不能理解.现在也做了一些算法题,哪些并不是很深奥,但需要一些技巧,简单的算法题更多的是经验值.这里 ...
- 小学数学开灯问题_三道简单的小学二年级的数学题,一遍过全对的还不到一半...
数学与工作.学习.生活息息相关,有时除了简单的运算,还需要结合生活中的常识. 下面三道小二年级的数学题,是某二年级数学老师出给自己班上学生的课堂练习,要求大家一遍过,不能修改.结果全对的还不到全班人数 ...
最新文章
- C#类方法中使用数组参数params关键字的作用
- Ios之label自适应里面的文字,自动调整宽度和高度的
- vue第二次ajax失效,解决VUE-Router 同一页面第二次进入不刷新的问题
- linux cp命令使用
- 1 echo();2 print();3 die();4 printf();5 sprintf();6 print_r();7 var_dump(); 区别
- Linux kill 多余用户终端
- android 发送按键 0,android monitor tool (8.0 模拟发送按键及触摸屏事件实现)
- zookeeper 阿里滴滴 有点用 zookeeper主从选举方式
- 网络信息安全常用术语
- 找茬小游戏微信小程序源码自带流量主功能+前端+后端+教程
- 编写一个JSP页面,实现根据一个人的18位身份证显示出生日的功能,要求把表达式声明和Scriptlet全部用到,并把结果显示在表格中
- php中的,理解php中的print EOT
- 10-门面模式Quarkus实现
- Error排错:container runtime network not ready
- 软件测试提交bug意思,软件测试bug定义及分类
- 王思聪 远程操控女主播“翻床”
- 将文件夹的分组方式应用到电脑的所有文件夹
- IDEA设置终端Terminal窗口字体和大小
- uniApp运行到微信小程序
- HTML如何实现带有滚动条的文本框