笔试试题.docx
《笔试试题.docx》由会员分享,可在线阅读,更多相关《笔试试题.docx(86页珍藏版)》请在冰点文库上搜索。
![笔试试题.docx](https://file1.bingdoc.com/fileroot1/2023-5/3/11fa51c3-8341-441a-b7e1-d74aa5216b98/11fa51c3-8341-441a-b7e1-d74aa5216b981.gif)
笔试试题
这部分的腾讯c/c++面试用的笔试题主要是c/c++、数据结构、简单算法、操作系统等方面的基础知识,方便去腾讯面试开发的同仁有所参考!
笔试题的题型好像有sizeof、树等选择题。
填空题是补充完整程序。
附加题有写算法的、编程的、数据库sql语句查询的。
还有一张c/c++开放性问题。
腾讯c/c++笔试题如下:
1、请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
#defineMax(a,b)(a/b)?
a:
b
2、如何输出源文件的标题和目前执行行的行数
intline=__LINE__;
char*file=__FILE__;
cout<<"filenameis"<<(file)<<",lineis"< 3、两个数相乘,小数点后位数没有限制,请写一个高精度算法
4、写一个病毒
while
(1)
{
int*p=newint[10000000];
}
5、不使用额外空间,将A,B两链表的元素交*归并
6、将树序列化转存在数组或链表中
structst{
inti;
shorts;
charc;
};
sizeof(structst);
7、
char*p1;
void*p2;
intp3;
charp4[10];
sizeof(p1...p4)=?
8、
4,4,4,10
二分查找
快速排序
双向链表的删除结点
由于近来有些人都问我腾讯笔试和面试到底是考什么,问什么,所以就灌下这篇水文,也算是我自己复习一遍以及给有兴趣或者后来者嗤鼻一笑的机会:
)
其实应聘内容也真的很难说清楚,而且我也不知道我所经历的是不是有代表性,何况我还是找工作的新手(本科也没找过工作,之前也只是应聘过华为),所以如果下文有什么疏漏之处,尽管踩我好了:
)
1。
笔试我想腾讯的笔试还是比较适中的,虽然广度与深度都不够,但是毕竟因为它只是笔试,只是用来筛选面试者的,而不是象学术竞赛一样一战决胜负,何况它是笔试,所以也就有笔试的局限性。
(啊哦,是不是离题?
)笔试主要是C++的内容,然后还有一部分数据结构、系统平台(WIN32和LINUX都有)的编程知识(线程模型、共享内存、编译或对象模型等)、JAVA(这次笔试JAVA有一题,是填写同步的关键字的,当然题目没有明明白白告诉你写synchronized这个关键字啦,否则就要被人BS了,哈哈。
好在JAVA下的同步基本实现机制相当简洁,只要刚才那个关键字申明一下就可以了,学过java多线程模型的人都应该知道填什么,可惜我那时我也拼写错误了,漏了一个字母。
。
。
,好象是5分一题的,损失不小哦)等。
可以说还是比较有代表性的。
这里罗嗦几句,有的人总是问为什么都考C/C++,我想因为C/C++才能比较好的表现出你的编程的水平(包括风格、惯用法、技巧性、严谨性等),就象堆积木,给你不同形状的积木越多,那你就越能堆出更多的造型。
还有就是是OOP(这里废话几句~~
OOP思想很重要,记得当年初次接触C++真的是只知其所然,而不知其所以然。
特别是“虚拟—virtual”这个词,可以说是最最核心的了,理解了它,你会觉得这个词实在太优美了,哈哈~~你可以这样测试你自己的OOP能力,针对OOP的三个特点用程序写出对应的例程,如果能够写得正确且健壮,那么应该也就什么问题了)做比较大的项目现在一般都采用OOP来实现的了(当然对于特殊的需求、环境和人除)。
VB和DELPHI虽然也很流行,一方面是他们没有国际标准,其次是由于它太高级了,一些传统的编程技术被隐藏了,姑且不论VB(6。
0以前)不支持OOP,那就更难用它来考OOP了,DELPHI支持OOP,但是我想很多同学都只是用它进行OBP,而不是OOP,所以。
。
。
至于JAVA,我本人也很喜欢,而且怎么说,JAVA也很接近C++,何况其API也比C/C++Library更规范、全面,所以使用起来很方便。
但是正如考数学分析比考高等数学往往会加深对数学的理解的道理一样,除此以外也有另一层寓意,假如你能徒手打败你的敌人,那么再给你一把利剑,我想你会在更短的时间内结束战斗,呵呵。
所以考C/C++还是比较合适的,公平是相对的。
。
。
2。
一面面试其实也挺难说的,因为这个环节很灵活,也许在面试之前连面试官自己都不知道他自己将要问什么,呵呵。
这里也只是给出一个case(归纳法不适用,呵呵)。
一面时,我只带了两页纸简历,到了面试地点,才发现很多人都是一叠资料的,有的人还不断在复习资料。
。
。
别提当时我有多狼狈了。
。
。
根据外貌和谈吐可以推断出一面面试官是一个前线的技术专家。
面试时首先自我介绍,我一向没刻意去背自我介绍,但是也事先想好了的。
然后就是问你哪种编程技术比较拿手啊,项目经验啊,我想关键是深度一定要够,一定要体现你的参与价值和收获,不管是开发过程还是开发技术。
面试时我分别从开发过程与开发技术两个方面说了两个项目,感觉面试官还是接受了的,然后小部分技术细节,比如说在一个项目里面为了解决一个问题,你采取了什么策略,采用了什么技术,这个可千万不能说错哦,不然你就是在自打嘴巴了。
。
。
也许我的笔试成绩还可以,所以语言层面的问题基本没有了。
总结,这个面试官很实在,也相当和蔼可亲。
。
。
3。
二面二面的面试官比一面的少,应该都是部门经理。
坐这个位置的人都是技术和管理的大拿了,当然这是后来知道的啦。
因此这次面试分技术和非技术两部分,不过主要还是技术的。
首先还是自我介绍。
。
。
然后面试官就开始设擂台了,问你觉得笔试试卷出得如何?
我思考了2秒钟,说比较适中(如果我说难,那么如果是简单的话,那我就被BS了,实际上也不难吧,说容易吧,如果我考得不好,分数我倒是看到过,但是不知道那算高还是低,所以很容易被BS),看面试官表情,显然我的回答应该没有W/A掉。
接着,他继续问到,你觉得你做错了或者没有把握的题目是哪题。
我就说了两三题了,然后他奸诈的看看了我的试卷,从他的表情,我知道,嘿嘿,这个回合是我赢了。
然后他就要我介绍一个有代表性的项目。
显然这次跟一面要有所变化才行,毕竟是二面了。
于是我挑了一个比较容易表述的,简洁清晰,又有一定技术难度的(主要是系统架构方面)展开攻防战,此情此景。
。
。
恩,你猜对了,就象电视上看到的警察审讯嫌疑犯一样,呵呵,只是这个“警察”是面带笑容的。
。
。
反正,他会象导弹一样追着你来“攻击”,如果你承受不了的话就要中弹了,等到你中得多了,游戏也就GAMEOVER了。
。
。
我想最好还是讲得高深一。
Tencent笔试题
一基础题:
1智力题
1.1有A、B、C、D四个人,要在夜里过一座桥。
他们通过这座桥分别需要耗时1、2、5、10分钟,只有一支手电,并且同时最多只能两个人一起过桥。
请问,如何安排,能够在17分钟内这四个人都过桥?
1.21-20的两个数把和告诉A,积告诉B,A说不知道是多少,B也说不知道,这时A说我知道了,B接着说我也知道了,问这两个数是多少?
1.3爸爸,妈妈,妹妹,小强,至少两个人同一生肖的概率是多少?
1.4某人去玩具店买小熊,单价30元.付给玩具店老板100元玩具店老板没零钱,去水果店换了100元零钱回来找给那人70元.那人走后,水果店老板找到玩具店老板说刚才的100元是假币,玩具店老板赔偿了水果店老板100元 问:
玩具店老板损失了多少钱?
2请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
3计算a^b<<2
4如何输出源文件的标题和目前执行行的行数?
5a[3][4]哪个不能表示a[1][1]:
*(&a[0][0]+5)*(*(a+1)+1)*(&a[1]+1)*(&a[0][0]+4)
6fun((exp1,exp2),(exp3,exp4,exp5))有几个实参?
7.希尔冒泡快速插入哪个平均速度最快?
8.enum的声明方式
9.频繁的插入删除操作使用什么结构比较合适,链表还是数组?
10.*p=NULL*p=newchar[100]sizeof(p)各为多少?
11.顺序查找的平均时间
12.for(i=0,sum=0;i<10;++i,sum+=i);的运行结果
13.不能做switch()的参数类型是
14.不使用其他变量,交换两个整型a,b的值
15.写出floatx与“零值”比较的if语句。
16.两个数相乘,小数点后位数没有限制,请写一个高精度算法
*********************************************************************数据库*********************************************************************
1.有个表tableQQ,有整型的ID项和字符类型的Nickname项,这两个项都不允许为空
(1)写出建立该表的SQL语句
(2)找出Nickname为QQ的用户,按ID降序排列的SQL语句
(3)写出删除ID为1234用户记录的SQL语句
(4)写出添加ID为5555,Nickname为'1234'的SQL语句
答案:
2.有关系s(sno,sname)c(cno,cname)sc(sno,cno,grade)
(1)问上课程"db"的学生
(2)成绩最高的学生号
(3)每科大于90分的人数
**********************************************************************操作系统网络
1.描述实时系统的基本特性
2.Internet采用哪种网络协议?
该协议的主要层次结构?
3.Internet物理地址和IP地址转换采用什么协议?
4.IP地址的编码分为哪俩部分?
答案
一基础题
1;1.1答案:
A&B-->2mins
1mins<--A
C&D -->10mins
2mins<--B
A&B -->2mins
一共2+1+10+2+2=17mins
1.2答案:
2和3
1.31-12*11*10*9/12*12*12*12=1-55/96=41/96
1.4答案:
70+小熊的进价
2答案:
#define max(a,b) ((((long)((a)-(b)))&0x80000000)?
b:
a)
若a>b,则a-b的二进制最高位为0,与上任何数还是0,所以大数为a;
否则,a-b为负数,二进制最高位为1,与上0x80000000(最高位为1其他为0)之后为1,
所以此时的大数为b.
3答案:
运算符优先级:
括号,下标,->和.(成员)最高; 单目的比双目的高;算术双目的比其他双目的高;位运算高于关系运算;关系运算高于按位运算(与,或,异或);按位运算高于逻辑运算;三目的只有一个条件运算,低于逻辑运算;赋值运算仅比,(顺序运算)高。
在此题中,位左移"<<"优先级高于按位异或"^",所以b先左移两位(相当于乘以4),再与a异或。
例如:
当a=6;b=4时;则a^b<<2=22
4答案:
printf("Thefilename:
%d\n",__FILE__);
printf("ThecurrentlineNo:
%d\n",__LINE__);
ANSIC标准预定义宏:
__LINE____FILE__
__DATE__
__TIME__
__STDC__ 当要求程序严格遵循ANSIC标准时该标识符被赋值为1__cplusplus__ 当编写C++程序时该标识符被定义
5答案:
*(*(a+1)+1);a是数组的首地址,a+1相当于&a[0][1],*(a+1)=a[0][1],则*(*(a+1)+1)=*(a[0][1]+1)=/=a[1][1]
6答案:
两个。
形式参数:
在声明和定义函数时,写在函数名后的括号中的参数。
实参是调用参数中的变量,形参是被调用函数中的变量。
7.答案:
快速排序;快速排序、归并排序和基数排序在不同情况下都是最快最有用的。
8.答案:
enum枚举类型名{枚举常量1,枚举常量2, ...枚举常量n};
Forexample:
enumweekday{sunday,monday,tuesday,wednesday,thursday,friday,saturday};
enumweekdayweek_day;//week_day就是一个枚举类型变量
9.答案:
链表
10.答案:
都为4。
因为都是指针类型,所占存储空间必然为4。
11.答案:
(1+2+3+...+n)/n=(n+1)/2
12.答案:
sum=55
13.答案:
switch的参数不能为浮点型。
14.答案:
x=x+y;y=x-y;x=x-y
15.if(x>=0.000001&&x<=-0.000001)(x不为0的比较)
float:
6位精度double:
16位精度
16.
二数据库
1
(1)CREATETABLEtableQQ(
IDNUMBER(12)NOTNULL,
NicknameVarchar2(30)NOTNULL);
(2)select*fromtableQQwhereNickname='QQ'orderbyIDdesc;
(3)deletefromtableQQwhere>
(4)insertintotableQQvalues(5555,'1234');//删除表
(5)droptabletableQQ;
三网络
1.答案:
在特定时间内完成特定的任务,实时性与可靠性。
2.答案:
TCP/IP协议。
应用层、传输层、网络层、数据链路层和物理层。
3.答案:
地址解析协议ARPaddressresolutionprotocol
4.答案:
网络号和主机号。
不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。
选择题(60)
c/c++oslinux方面的基础知识c的Sizeof函数有好几个!
程序填空(40)
1.(20)4空x5
不使用额外空间,将A,B两链表的元素交叉归并
2.(20)4空x5
MFC将树序列化转存在数组或链表中!
1.请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
//这样转向定义应该不算违规吧!
^_^
#include“stdafx.h”
#include
#include
usingnamespacestd;
#defineCmp(x,y)compare(x,y)
intcompare(inta,intb)
{
a^=(1<<31);b^=(1<<31);
inti=31;
while((i^-1)&&!
((a&(1<
return(i^-1)?
(((a>>i)&1)?
1:
-1):
0;
}
int_tmain()
{
intc;
c=Cmp(5,4);
cout<return0;
}
jruv(~~~一叶落而知天下秋~~~)的答案:
#defineCOMPARE(a,b)((a)-(b))//<0:
a
a==b>0:
a>b
2.如何输出源文件的标题和目前执行行的行数
cout<<“Filename”<<__FILE__<<”Line”<<__LINE__<3.两个数相乘,小数点后位数没有限制,请写一个高精度算法
算法提示:
输入stringa,stringb;计算stringc=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;(同整数的大数相乘算法)
4,输出c,(注意在输出倒数第l个数时,输出一个小数点。
若是输出的数少于l个,就补0)
du51(郁郁思扬)的答案:
变为整数求就行了.输入的时候记一下,小数点位置..输出再做点文章就行了.
下面的是大整数的运算.
#include
usingnamespacestd;
#defineMAX10000
structNode{
intdata;
Node*next;
};
voidoutput(Node*head)
{
if(!
head->next&&!
head->data)return;
output(head->next);
cout<data;
}
voidMul(char*a,char*b,intpos)
{
char*ap=a,*bp=b;
Node*head=0;
head=newNode;head->data=0,head->next=0;//头
Node*p,*q=head,*p1;
inttemp=0,temp1,bbit;
while(*bp)//若乘数不为空,继续.
{
p=q->next;p1=q;
bbit=*bp-48;//把当前位转为整型
while(*ap||temp)//若被乘数不空,继续
{
if(!
p)//若要操作的结点为空,申请之
{
p=newNode;
p->data=0;
p->next=0;
p1->next=p;
}
if(*ap==0)temp1=temp;
else{temp1=(p1->data)+(*ap-48)*bbit+temp;ap++;}
p1->data=temp1%10;//留当前位
temp=temp1/10;//进位以int的形式留下.
p1=p;p=p->next;//被乘数到下一位
}
ap=a;bp++;q=q->next;//q进下一位
}
p=head;
output(p);//显示
cout<while(head)//释放空间
{
p=head->next;
deletehead;
head=p;
}
}
intmain()
{
cout<<”请输入两个数”<chartest1[MAX],test2[MAX];
cin.getline(test1,MAX,’\n’);
cin.getline(test2,MAX,’\n’);
Mul(strrev(test1),strrev(test2));
system(”PAUSE”);
return0;
}
上面大整数已经写了.你加几个东西就行了.
#include
usingnamespacestd;
#defineMAX10000
structNode{
intdata;
Node*next;
};
voidoutput(Node*head,intpos)
{
if(!
head->next&&!
head->data)return;
output(head->next,pos-1);
cout<data;
if(!
pos)cout<<”.”;
}
voidMul(char*a,char*b,intpos)
{
char*ap=a,*bp=b;
Node*head=0;
head=newNode;head->data=0,head->next=0;//头
Node*p,*q=head,*p1;
inttemp=0,temp1,bbit;
while(*bp)//若乘数不为空,继续.
{
p=q->next;p1=q;
bbit=*bp-48;//把当前位转为整型
while(*ap||temp)//若被乘数不空,继续
{
if(!
p)//若要操作的结点为空,申请之
{
p=newNode;
p->data=0;
p->next=0;
p1->next=p;
}
if(*ap==0)temp1=temp;
else{temp1=(p1->data)+(*ap-48)*bbit+temp;ap++;}
p1->data=temp1%10;//留当前位
temp=temp1/10;//进位以int的形式留下.
p1=p;p=p->next;//被乘数到下一位
}
ap=a;bp++;q=q->next;//q进下一位
}
p=head;
output(p,pos);//显示
cout<while(head)//释放空间
{
p=head->next;
deletehead;
head=p;
}
}
intmain()
{
cout<<”请输入两个数”<chartest1[MAX],test2[MAX],*p;
intpos=0;
cin.getline(test1,MAX,’\n’);
cin.getline(test2,MAX,’\n’);
if(p=strchr(test1,’.'))
{
pos+=strlen(test1)-(p-test1)-1;
do
{
p++;
*(p-1)=*p;
}while(*p);
}
if(p=strchr(test2,’.'))
{
pos+=strlen(test2)-(p-test2)-1;
do
{
p++;
*(p-1)=*p;
}while(*p);
}
Mul(strrev(test1),strrev(test2),pos);
system(”PAUSE”);
return0;
}
4.写一个病毒
cout<<”一个病毒”<(开玩笑的,没搞过,^_^)
5.让你在100000000个浮点数中找出最大的10000个,要求时间复杂度优。
//本算法使用快排,O(n*lg(n))
//最低可以找到线性算法,使用预先区域统计划分!
类试于构造QuadTrees!
写起来代码会长些!
#include
#include
#defineMax100000000
inta[Max+10];
intcmp(constvoid*a,constvoid*b)
{
int*x=(int*)a;
int*y=(int*)b;
return*x-*y;
}
intmain()
{
intn=0;