腾讯2016年实习生招聘笔试题

腾讯2016年实习生(JAVA)笔试题

想着报这试试的心理,投了腾讯2016的JAVA实习生岗位.今天笔试,说说感受吧。

第一部分

第一部分考的东西比较杂,很多关于android、ios开发的题,还有一些关于操作系统的题。数据库有一个题,还有关于C++的题,基本上是没有关于JAVA的题,可是我投的是JAVA岗也,呜呜。

由于最近在学习MySQL数据库,对于数据库的题还是比较感兴趣的,题目(多选题)大致如下:

select * from score_table order by score;

其中score_table表中score列中有一个值是NULL的,主要考点就在这里,提供的4个选项(题目中以排序的结果给出,这里我主要用文字描述下)是:(1)NULL出现在结果的第一个位置(2)NULL出现在结果的最后一个位置(3)NULL出现在score=0值的前面(4)NULL出现在score=0值的后面。

由于自己最近虽然在学习数据库,在对这里NULL这个还真没有研究,只知道当用order by来进行排序的时候,order by会忽略掉为NULL的行,但是具体NULL行的数据是放在结果的前面还是后面还真不太清楚,因此这个题就凭感觉在做,个人觉得NULL是不会与零值进行比较的,因此NULL只会出现在结果的第一个位置或者是最后一个位置。至于到底会出现在第一个位置,还是最后的位置,应该取决去数据库的内部具体实现。

上面是自己在做这个题当时的想法,下来之后,在MySQL数据库中,实验了下,结果如下:

从结果可以看出:NULL值出现在结果的第一行。由于这个题是一个多选题,因此可以猜测的是:对于其他的数据库,可能会出现在最后一行的。

本着好奇的心理百度了下,结果如下(来源:http://blog.csdn.net/zzwei321/article/details/6222615):

oracle、mssql、mysql三种数据库产品在order by时:
Oracle在Order by时缺省认为null是最大值,所以如果是ASC升序则排在最后,DESC降序则排在最前面;
mssql和mysql在order by时缺省认为null是最小值,所以如果是ASC升序则排在最前面,DESC降序则排在最后;

根据上面的描述和自己的实验,发现确实不同的数据库处理NULL是不一样的。MySQL在排序把NULL当做最小值来进行处理,而Oracle在排序中把NULL当做最大值来进行处理。

第二部分

上面这个题是自己在这次笔试第一部分中觉得比较有趣的一个题目,而第二部分中有四个答题:第一题忘记是什么了,反正我不会做,没有做。

第二个题:寻宝找最大值

第二个题目就是一个:寻宝找最大值的题目。即给你一个M*N的矩阵,一个人从左上角开始,只能向右或向下走,问经过的路径的最大值是多少??

大致的题意就是这样,相信有一点编程基础的人都会觉得不难,确实不太难,解决思路就是利用递归来实现即可。实现代码如下:

#include<stdio.h>
#include<stdlib.h>
/*
 用递归来完成 
*/
int max(int a,int b){
    return a>b?a:b;
} 
int maxValueHelper(int **arr,int rowSize,int colSize,int rowIndex,int colIndex){
    //先进行有效性检查 
    if(arr==NULL||rowSize<1||colSize<1||rowIndex<0||rowSize<=rowIndex||colIndex<0||colSize<=colIndex){
        return 0;
    }   
    int maxValueInDown=arr[rowIndex][colIndex]+maxValueHelper(arr,rowSize,colSize,rowIndex,colIndex+1);
    int maxValueInRight=arr[rowIndex][colIndex]+maxValueHelper(arr,rowSize,colSize,rowIndex+1,colIndex);
    return  max(maxValueInDown,maxValueInRight);

}

int maxValue(int **arr,int rowSize,int colSize){
    return maxValueHelper(arr,rowSize,colSize,0,0); 
}
int main(void){
    int m,n;
    while(scanf("%d %d",&m,&n)!=EOF&&0<m&&m<=1000&&0<n&&n<=1000){
        int **arr=(int **)malloc(m*sizeof(int *));
        if(arr==NULL){
            printf("malloc fail\n");
            return -1;
        }
        //输入数据 
        int i=0;
        for(;i<m;i++){
            arr[i]=(int *)malloc(n*sizeof(int));
            if(arr[i]==NULL){
                printf("malloc fail\n");
                return -1;
            }
            int j=0;
            for(;j<n;j++){
                scanf("%d",&arr[i][j]);
            }
        }
        int res=maxValue(arr,m,n); 
        printf("%d\n",res);
    }
    return 0;
}

第三个题:字符串翻转

第三个题目也是一个编程题,比较常见的题目:字符串的翻转,就是将“ I come from China.” 翻转为 “China. from come I”。

无论选择什么语言都比较好实现。如果你选择用Java来实现,只需要将字符串用空格分开即可,利用str.splite(” “)得到单词数组然后逆序将单词连接起来即可。这里我选择使用C语言来实现,实现代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void swap(char *a,char *b){
    char temp=*a;
    *a=*b;
    *b=temp;
}
void reverseWord(char *str,int start,int end){
    if(str==NULL||start>=end){
        return;
    }
    while(start<end){
        swap(&str[start],&str[end]);
        start++;
        end--;
    }
}

void reverseString(char *str){
    if(str==NULL){
        return;
    } 
    int len=strlen(str); 
    //第一步:翻转每个单词。
    int i=0;
    int start=0;
    int end=0;
    for(;i<len;i++){
        if(str[i]!=' '){
            start=i;
            while(i<len&&str[i]!=' '){
                i++;
            }
            end=i-1;
            reverseWord(str,start,end);         
        }
    }
    //puts(str);
    //第二步:翻转整个字符串
    reverseWord(str,0,len-1); 
}

int main(void){
    char s[100];
    gets(s);
    reverseString(s)    ;
    puts(s);
}

最后一题:同步

最后一个题是关于同步的题:问一些如果不同步有什么后果,以及如果你作为架构师,你的解决方法之类的。

就这个题,自己就类比了我们所常见的火车站卖票的如果不同步会出现什么样的后果来说明这个问题,以及解决方法就是我们常见的synchronized来进行同步了。

小结

说先笔试的感受,感受就是:自己还是有很多的不足吧,自己也接触过一段时间的android开发,但是到现在基本上是忘光了,什么都不会了。关于JAVA的基本上没有一个题,所以没有什么感受。算法题比较基础,不难。总体来说,答的不好,相信腾讯应该不会要我等渣渣吧,呜呜,吼吼。。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值