网上看到的腾讯面试笔试题部分解析

在网上看到的腾讯面试的几道算法方面的笔试题分享如下,供大家参考:
1、给一个无重复整数数组, 找到其中包含最多连续数的子集,比如给:15, 7, 12, 6, 14, 13, 9, 11,则返回: [11, 12, 13, 14, 15] 。
2、 倒转一个字符串,要求要在原字符串上执行,并且效率最高,如输入"abc",输出“cba”,输入"abcd",输出"dcba"。
3、给定一个整数,求出其中0出现的次数。不允许将数字转化为字符串。如输入2006,则输出2。
4、现在硬盘里有几十亿条QQ的号码,如何得出每一个QQ号码重复的次数,假设计算机运行内存是有限的。
下面给出我自己的解答,当然了,由于对c语言比较生疏了,所以用js代为实现,大家明白实现原理即可。

解答1:

// 说明:我对于该题的解答事件复杂度组合要取决于排序的时间复杂度(一般最快的为O(nlogn)),该题目还有一种时间复杂度为O(n)的算法,但是要用到一种叫做并查集的数据结构,而且它占用内存较多,属于以空间换时间的一种算法。另外这里我只获取了一个最长的子序列情况,但是要考虑有多个最长子序列的情况,当然也比较容易在下面的程序上扩展实现。
function getMaxSubList(ary){//ary为无重复整数数组
        // 处理特殊情况
        if(!(ary instanceof Array)){
            return [];
        }
        var len = ary.length;
        if(len <= 1){
            return ary;
        }
        ary.sort(function(a,b){
            return a-b;
        });// 升序排序
        ary[len++] = Infinity;
        var start = -1,nStart,
            count = 1,nCount = 0;
        var i = 1;
        for(;i

解答2:

//这个比较简单,知道实现思想即可。时间复杂度:O(n/2)
function reverseStr(str){
        var strAry = str.split("");
        var len = str.length,
            s = 0,
            halfLen = Math.floor(len/2);
        while(s !== halfLen){
            strAry[s] = [strAry[len-s],strAry[len-s] = strAry[s]][0];
            s++;
        }
        return strAry.join("");
    }
    console.log(reverseStr("abcd"));

解答3:

function getZeroNum(num){
        if(num < 10){
            return num%10 ===0?1: 0;
        }
        var i = 100;
        var count = 0;
        while(num%i !== num){
            if(i === 100 && num%10 === 0){
                count++;
            }
            if(num%i - num%(i/10) === 0){
                count++;
            }
            i *= 10;
        }
        return count;
    }
    console.log(getZeroNum(1020));

解答4:
这是一个典型的大数据处理问题。我们可以先对所有数据进行排序,然后遍历一遍记录每个QQ号出现的次数即可得出结果。由于数据量较大,把所有的数据放入到内存里去实现的话是不现实的。那这里就用到了一种很典型的不在内存里排序的方法,即”外部排序“,即在计算机外部存储(如硬盘、磁带等)里排序。那如何排呢?就用到了外部排序实现的一种经典排序算法:归并排序(当然内部排序也可以用,其优势一般体现在数据量较大的情况下)。归并排序的实现思想就是二分,然后对每一个子集进行排序后再合并两个子集,这样的话只要我们实现了一个合并两个已经排好序的子集的方法之后我们就可以用递归的思想去实现递归排序。我用js实现了一下:

// 数组ary从p到q是有顺序的,从q到r是有顺序的
    function merge(ary,p,q,r){
        var a = [],
            b = [];
        for(var i = p;i<=q;i++){
            a[a.length] = ary;
        }
        for(i = q+1;i


你可能感兴趣的:(算法)