四月份遇到的一些笔试题(回忆版一)
2015-04-28 10:31
232 查看
如果读者们最下面的题目有更好的想法请联系我交流一下,QQ 1192625541
1.已知A、B、M都在集合S中,且满足A+B=M,求M得最大值,并分析算法的复杂度
这道题的思路是这样的,先对S进行排序,从小到大,然后从最大的元素M开始,设置两个指针分别指向第一个元素A和最大的元素减一的B,如果A+B=M,OK,最大的M找到了,如果A+B<M,指向A的指针右移,如果A+B>M,指向B的指针左移,如此循环,一直找不到的话,M就设为第二大的元素,继续重复之前的步骤,直到找到最大的M,全部扫完找不到就返回-1,代码如下:
这道题目是编程之美上的经典题目,也是很多IT公司常考的题目,思路就是分而治之,大问题化成小问题,代码如下:
3.实现一个函数,对一个正整数n,算得到1需要的最少操作次数。操作规则为:如果n为偶数,将其除以2;如果n为奇数,可以加1或减1;一直处理下去.代码如下:
4.腾讯面试题:求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。
回答:
一天总共有3600*24=86400秒。
定义一个长度为86400的整数数组intdelta[86400],每个整数对应这一秒的人数变化值,可能为正也可能为负。开始时将数组元素都初始化为0。
然后依次读入每个用户的登录时间和退出时间,将与登录时间对应的整数值加1,将与退出时间对应的整数值减1。
这样处理一遍后数组中存储了每秒中的人数变化情况。
定义另外一个长度为86400的整数数组intonline_num[86400],每个整数对应这一秒的论坛在线人数。
假设一天开始时论坛在线人数为0,则第1秒的人数online_num[0]=delta[0]。第n+1秒的人数online_num
=online_num[n-1]+delta
。
这样我们就获得了一天中任意时间的在线人数。(参考自http://seo.pingce.cc/seoss/baidu/20130619122.html)
1.已知A、B、M都在集合S中,且满足A+B=M,求M得最大值,并分析算法的复杂度
这道题的思路是这样的,先对S进行排序,从小到大,然后从最大的元素M开始,设置两个指针分别指向第一个元素A和最大的元素减一的B,如果A+B=M,OK,最大的M找到了,如果A+B<M,指向A的指针右移,如果A+B>M,指向B的指针左移,如此循环,一直找不到的话,M就设为第二大的元素,继续重复之前的步骤,直到找到最大的M,全部扫完找不到就返回-1,代码如下:
int maxM(int a[]){ quiksort(a[]); int right,left,sum; for(int i=a.length;i>=2;i--){ left=0; right=i-1; while(left<right){ sum=a[left]+a[right]; if (sum==a[i]){ return a[i]; } else if(sum>a[i]){ right--; } else{ left++; } } } return -1; }
</pre><pre>2.求子数组和最大的问题
这道题目是编程之美上的经典题目,也是很多IT公司常考的题目,思路就是分而治之,大问题化成小问题,代码如下:
int maxshuzu(int a[]){ int len=a.length-1; int all=a[len]; int start=a[len]; for(int i=len-1;i>=0;i--){ start=max(start+a[i],a[i]); all=max(all,start); } return all; }如上代码时间复杂度为O(n),空间复杂度为O(1)
3.实现一个函数,对一个正整数n,算得到1需要的最少操作次数。操作规则为:如果n为偶数,将其除以2;如果n为奇数,可以加1或减1;一直处理下去.代码如下:
int max1(int n){ int i=0; if (n==0){ System.out.println("wrong!"); return -1; } if (n==1) return 0; if (n%2==0) return 1+max1(n/2); int x=max1(n+1); int y=max1(n-1); if (x>y) return y+1; else return x+1; }
4.腾讯面试题:求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。
回答:
一天总共有3600*24=86400秒。
定义一个长度为86400的整数数组intdelta[86400],每个整数对应这一秒的人数变化值,可能为正也可能为负。开始时将数组元素都初始化为0。
然后依次读入每个用户的登录时间和退出时间,将与登录时间对应的整数值加1,将与退出时间对应的整数值减1。
这样处理一遍后数组中存储了每秒中的人数变化情况。
定义另外一个长度为86400的整数数组intonline_num[86400],每个整数对应这一秒的论坛在线人数。
假设一天开始时论坛在线人数为0,则第1秒的人数online_num[0]=delta[0]。第n+1秒的人数online_num
=online_num[n-1]+delta
。
这样我们就获得了一天中任意时间的在线人数。(参考自http://seo.pingce.cc/seoss/baidu/20130619122.html)
相关文章推荐
- 最近遇到的一些笔试面试题目(持续更新中。。)
- 网上整理的一些C++的笔试题(包括自己遇到的)
- 笔试面试中遇到的一些智力题总结和思考,欢迎补充和指正
- 笔试面试中遇到的一些智力题总结和思考,欢迎补充和指正
- 一些自己曾经遇到过的笔试题
- 笔试中遇到的一些算法问题
- 一些笔试面试时遇到的以及自己准备的题目
- 经过几次的面试和笔试或者考试,难免会遇到一些棘手问题(总结下,为下一站准备)
- 最进2011校招笔试中遇到的一些算法c语言的
- 遇到过的一些php笔试题
- 面试中遇到的一些笔试题
- 遇到的一些笔试题
- 面试笔试遇到的一些题
- 昨天工作中编写VBA模块时遇到的一些小问题
- 遇到一些问题及解决方法随记
- 做东西时遇到的一些问题以及解决方法~
- spark 使用中会遇到的一些问题及解决思路
- 写JAVA代码时常遇到的一些小问题
- android开发(二)android开发中遇到的一些基本常识