您的位置:首页 > 其它

四月份遇到的一些笔试题(回忆版一)

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,代码如下:

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: