腾讯 题集

腾讯


QQ-JAVA开发工程师

工作职责:
参与技术难题攻关;
项目的技术方案设计及编码实现;

工作要求:
本科以上学历,3年以上Java语言开发经验;
熟悉Struts、Spring、Hibernate框架,熟悉JSP、Servlet、Ajax、Web Service技术;
熟悉TCP/IP,HTTP/S, 有网络通信编程经验;
掌握多线程开发;熟悉Linux操作系统,可以熟练使用常用的Linux命令完成日常工作,熟练掌握shell编

程;富有创新精神,充满激情,有良好的沟通及协作能力。


DZ-后台Java开发工程师

工作职责:
电子商务垂直类目后台管理、运营系统设计、开发

工作要求:
精通Java,J2ee,Javascript相关技术和体系架构,具备2年以上相关项目开发经验;精通Struts,

Spring, Hibernate或类似Java体系的应用,深入理解原理熟悉Unix/Linux操作系统原理,常用工具,具

备Unix/Linux下开发经验熟悉Mysql/Oracle等数据库管理、开发,SQL调优; 精通/熟悉常用设计模式,对

面向对象有较深入的理解;高度的责任心、良好的沟通技巧和团队合作精神,正直进取,有上进心,热爱

开发事业。

WXY-JAVA开发工程师

工作职责:
计算机相关专业,大学本科以上学历,3年以上工作经验。
熟悉Unix/Linux下JAVA开发,有海量系统开发经验;
熟悉MYSQL或其他关系型数据库,并有数据Cache经验者尤佳
熟悉当前比较流行的WEB容器的结构、部署、调优,熟悉各种容器优缺点尤佳。
熟悉无线互联网环境,有最新的android,ios等平台的开发经验尤佳。
全面的软件知识结构(操作系统、数据结构、数据库系统、网络安全);
具备良好的学习能力和分析解决问题能力;
责任心强,良好的对外沟通和团队协作能力。
工作要求:
大型wap业务开发和维护,海量数据服务的系统架构设计和实现,android、iphone等平台上的应用的开发


在网上看到这篇文章,转载过来和阿友们分享一下。
第一面,面技术,问了我的项目,STL,红黑树,练表反转+笔试错题重做
        我后面面的很不好,很多都不会,分数较低
第二面,面技术,给我出了个算法题,星际在地图上点一块,如何找到该块上的所有物体
        有可能会出逻辑推理题或者数学题

第三面,综合面,链表排序,easy
第四面,HR面试,胡扯了。有没有Offer听天由命了,嘻嘻,给后来的人一个参考



软件开发职位笔试试题
一、单项选择
     1、向单链表插入节点;
2、排序的稳定性比较;
3、带头节点的单链表的判空条件;
4、二叉树的节点总数的计算;
5、递归向非递归的转化使用什么?队列,还是栈;
6、中断响应时间的定义;
7、面向对象程序设计语言不同于其他语言的主要特点;
二、填空题
1、正弦函数用泰勒展开式来计算:
      下面的流程图描述了利用上述展开式计算并打印sinx的近似值的过程,其中e(>0)表示误差要求,小于该误差就可以结束计算,打印结果,请填写流程图中的空格部分。
图略
2、双循环链表的排序问题;
应该比较简单,相信你们能够搞定!
三、附加题

“背包问题”的基本描述是:有一个背包,能盛放的物品总重量为S,设有N个物件,其重量分别为W1,W2, ……… , Wn , 希望从N件物品中选择若干物品,所选择的物品的重量之和恰能放入该背包,即所选物品的重量之和等于S。递归和非递归解法都可以求得“背包问题”的一组解,试写出“背包问题”的非递归解法。


----

1, 使用Linux epoll模型,水平触发模式(Level-Triggered);当socket可写时,会不停的触发socket可写的事件,如何处理?

2, 从socket读数据时,socket缓存里的数据,可能超过用户缓存的长度,如何处理? 例如,socket缓存有8kB的数据,而你的缓存只有2kB空间。

3, 向socket发送数据时, 可能只发送了用户缓存里的一半,如何处理?例如,需要向socket发送8kB数据,返回值只有2kB发送成功。


4, C++的虚函数是怎么实现的?

5, C++的虚函数有什么作用?

6, 非阻塞connect()如何实现?

7,sizeof()问题

class A
{
  char c;
  int   val;
  short sh;
}


class B
{
    char c;
    int   val;
    short sh;
    void func1(void);
    virtual func2(void);
}

sizeof(A), sizeof(B) 分别是多少?

8, 实现字符串比较函数  strcmp(char *src, char * sub)

9, 实现内存拷贝函数  strcpy(void*dst, char * src, size_t len)

10,条件变量的如何使用? 你使用的线程函数是什么?

11, deamon进程如何实现?

12, HTTP和CGI是什么?

13, TCP的三次握手, TIME_WAIT和CLOSE_WAIT状态是什么?


因为第7题之后的属于客观题,不打算在此写答案。 朋友们如有好的答案也欢迎跟贴。

本人在此写出自己对前6个问题的回答:

1, 使用linux epoll模型,水平触发模式(Level-Triggered);当socket可写时,会不停的触发socket可写的事件,如何处理?

第一种最普通的方式: 
    当需要向socket写数据时,将该socket加入到epoll模型(epoll_ctl);等待可写事件。
    接收到socket可写事件后,调用write()或send()发送数据。。。
    当数据全部写完后, 将socket描述符移出epoll模型。
  
    这种方式的缺点是:  即使发送很少的数据,也要将socket加入、移出epoll模型。有一定的操作代价。

第二种方式,(是本人的改进方案, 叫做directly-write)

    向socket写数据时,不将socket加入到epoll模型;而是直接调用send()发送;
    只有当或send()返回错误码EAGAIN(系统缓存满),才将socket加入到epoll模型,等待可写事件后,再发送数据。
    全部数据发送完毕,再移出epoll模型。

     这种方案的优点:   当用户数据比较少时,不需要epool的事件处理。
     在高压力的情况下,性能怎么样呢?  
      对一次性直接写成功、失败的次数进行统计。如果成功次数远大于失败的次数, 说明性能良好。(如果失败次数远大于成功的次数,则关闭这种直接写的操作,改用第一种方案。同时在日志里记录警告)
     在我自己的应用系统中,实验结果数据证明该方案的性能良好。
    
    事实上,网络数据可分为两种到达/发送情况:
     一是分散的数据包, 例如每间隔40ms左右,发送/接收3-5个 MTU(或更小,这样就没超过默认的8K系统缓存)。
     二是连续的数据包, 例如每间隔1s左右,连续发送/接收 20个 MTU(或更多)。

回来查了资料,发现以下两种方式:

    第三种方式:  使用Edge-Triggered(边沿触发),这样socket有可写事件,只会触发一次。
             可以在应用层做好标记。以避免频繁的调用 epoll_ctl( EPOLL_CTL_ADD, EPOLL_CTL_MOD)。  这种方式是epoll 的 man 手册里推荐的方式, 性能最高。但如果处理不当容易出错,事件驱动停止。

第四种方式:  在epoll_ctl()使用EPOLLONESHOT标志,当事件触发以后,socket会被禁止再次触发。
             需要再次调用epoll_ctl(EPOLL_CTL_MOD),才会接收下一次事件。   这种方式可以禁止socket可写事件,应该也会同时禁止可读事件。会带来不便,同时并没有性能优势,因为epoll_ctl()有一定的操作代价。


2, 从socket读数据时,socket缓存里的数据,可能超过用户缓存的长度,如果处理?
       可以调用realloc(),扩大原有的缓存块尺寸。
       但是临时申请内存的有一定性能损失。

      这种情况要看接收缓存的方式。
第一种方式:  使用100k的大接收缓存为例。
               如果要等待数据,并进行解析。可能发生缓存不够的情况。此时只能扩充缓存,或先处理100k的数据,再接收新的数据。
第二种方式: 使用缓存队列,分成8K大小的队列。
               不存在接收缓存不够的情况。 除非用户解析已出错,使用数据接收、使用脱勾。这种方式的代价是,可能需要将缓存队列再次拷贝、拼接成一块大的缓存,再进行解析。而在本人的系统中,只需要将socket接收的数据再次原样分发给客户, 所以这种方案是最佳方案。

3, 向socket发送数据时, 可能只发送了用户缓存里的一半,然后失败,如何处理?

      记录缓存的偏移量。 下一次socket写事件时, 再从偏移的位置接着发送。
     
       那个面试官居然对这个问题问了我两次, 看来我解释的不够清晰。。。。。。 郁闷。

4, C++的虚函数是怎么实现的?
       使用虚函数表。
       回来查下资料:  C++对象使用虚表, 如果是基类的实例,对应位置存放的是基类的函数指针;如果是继承类,对应位置存放的是继承类的函数指针(如果在继承类有实现)。所以,当使用基类指针调用对象方法时,也会根据具体的实例,调用到继承类的方法。

5, C++的虚函数有什么作用?

        虚函数作用是实现多态, 很多人都能理解这一点。但却不会回答下面这一点。

       更重要的,虚函数其实是实现封装,使得使用者不需要关心实现的细节。在很多设计模式中都是这样用法,例如Factory、Bridge、Strategy模式。 前两天在书上刚好看到这个问题,但在面试的时候却没想起来。
        个人觉得这个问题可以很好的区分C++的理解水平。

6, 非阻塞connect()如何实现?

将socket设置成non-blocking,操作方法同非阻塞read()、write();
       面试官是在听到我介绍之后,才问我这个问题。可惜还是问我两遍。

**************
1.cache 的作用是什么

2.一下集中排序中,哪种是不稳定排序

3.排序算法的效率由什么衡量

4.在双向链表中,将一个节点P插入到链表中的节点Q后面,一下正确的操作是?

(2)填空题

1.是一个sin函数问题,给出sin的泰勒展开公式,和一个带有空格的程序流程图,完成程序流程图的空格。

sin(x)=x/1! - x3/3!+ x5/5! - …(-1)m-1 x(2m-1)/(2m-1)!

首先读入X,要求最后误差不差过m,流程图如下



2.链表,结构体  包括 1数据 2该节点被访问次数freq  要求一个节点每次被访问则freq++,整个链表按被访问次数(即访问频度)非升序排列。每次访问完节点后都对链表进行排序。

附加题:

背包问题。一个背包刚好装S克东西,有N个物体 重量分别是:W1 W2 W3….WN  请编程 用非递归的方法 得出一组解。

第一面,面技术,问了我的项目,STL,红黑树,练表反转+笔试错题重做
        我后面面的很不好,很多都不会,分数较低
第二面,面技术,给我出了个算法题,星际在地图上点一块,如何找到该块上的所有物体
        有可能会出逻辑推理题或者数学题

第三面,综合面,链表排序,easy
第四面,HR面试,胡扯了。有没有Offer听天由命了,嘻嘻,给后来的人一个参考

软件开发职位笔试试题
一、单项选择
     1、向单链表插入节点;
2、排序的稳定性比较;
3、带头节点的单链表的判空条件;
4、二叉树的节点总数的计算;
5、递归向非递归的转化使用什么?队列,还是栈;
6、中断响应时间的定义;
7、面向对象程序设计语言不同于其他语言的主要特点;
二、填空题
1、正弦函数用泰勒展开式来计算:
      下面的流程图描述了利用上述展开式计算并打印sinx的近似值的过程,其中e(>0)表示误差要求,小于该误差就可以结束计算,打印结果,请填写流程图中的空格部分。
图略
2、双循环链表的排序问题;
应该比较简单,相信你们能够搞定!
三、附加题
“背包问题”的基本描述是:有一个背包,能盛放的物品总重量为S,设有N个物件,其重量分别为W1,W2, ……… , Wn , 希望从N件物品中选择若干物品,所选择的物品的重量之和恰能放入该背包,即所选物品的重量之和等于S。递归和非递归解法都可以求得“背包问题”的一组解,试写出“背包问题”的非递归解法。

面试官以提问+代码
相结合。我的问题有:自我介绍,项目介绍,这两个是必须的,在介绍项目的时候,面试
官会深入问问题,会对某些细节,例如数据机构,算法复杂度,数据库连接问一些问题。
随后是专业面试,题目都是相当经典的题目,大致有:进程与线程;Unix和windows进程间
通信的主要方式和系统调用;叙述TCP/UDP协议,他们的应用,TCP的三次握手,滑动窗口
,超时重传;HTTP协议和COOKIE机制和一些COOKIE的问题(这个我不会);让你设计一个PD
A上的通信簿,你会用树还是哈希,从这个问题会引申出hash,平衡数,红黑数的一系列问
题;面向对象的多态是什么,设计一个多态的例子;C++的虚函数实现机制。问题不难,但
是你回答问题的手段和技巧很重要。几个经验:要有自信,敢说精通,熟悉这些词语,对
自己的强项一定要毫不犹豫的说精通。回答问题之前,好好组织一下语言,不要说的颠三
倒四,逻辑不清。问题一定要回答的全面,你说的越多越好,如果能把相关方面说出来更
好。

面我的据
说是互动娱乐部的一个manager(HR说的),面的问题很无聊:进程和线程,TCP/UDP,排序算
法(让我给他完整的说了一遍我所知道的排序算法和他们的时间复杂度),Windows的内存寻
址方式,Socket中阻塞模式干什么用的,你所认为的软件开发模式和你对你所做项目的一
些评价。最后是一个程序题,写代码,个题非常重要,如果做不出来或者做错了,那就
估计没戏了。题目是给定一个字符串,例如abc123de4f67,把里面所有的数字字串找出来,
并且存贮起来,例如你要把123,4,67找出来,放到3个char型数组里。这个题目很经典了
,相信很多人都知道。

两道算法题:
1.       给出一个字符串str及指定一个位置p,交换p的前后两段字符串,要求额外空间开销尽量小。例如给出str=”people”,p=2,结果串变为str=”oplepe”。其实只要一个char型变量作为临时空间,将p前的字符一个一个“沉”到最后就OK了,当时没想得出来真是丢脸啊!呜呜!
2.       给出串A=”iqwqrpwpetppwanepnvomzlplte”,B=”people”,问能否通过在串B的任意位置插入位置个字符生成串A,如果可以,计算出有多少种不同的生成方法,要求时间复杂度尽量小。一看这道题很容易误导思维,让人以B为考虑的出发点。事实上,换过来思考,问题就是找串A中有没有顺序地出现过B中的所有字符,这样就简单多啦,时间复杂度仅为O(m+n)!

第一大部分:
15道选择题,都是C/C++ 和数据结构的最基础的,基本上不会做错那种。

第二大部分:
程序填空2题:
1.前序遍历的
2.数组静态链表的插入
每题4空共40分

第三大部分:(每题20分,共60分)
附加题
1.实现3D镜像转换矩阵(题目不太明白,明白的同学给解释一下吧)
2.数据库SQL
  a)建立employe表,包括工号、姓名、性别、年龄、部门、工资。
  b)查询每个部门的工资总数
  c)查询工资高于本部门平均工资的员工姓名
3.到商店里买200的商品返还100优惠卷(可以在本商店代替现金),请问
  实际上折扣是多少?请写出推理过程。

你可能感兴趣的:(设计模式,linux,socket,面试,腾讯)