腾讯研发工程师笔试题(整理)
腾讯研发工程师笔试题
1.爸爸去哪儿中的3对父子站成一排,各自父子之间不能相邻,比如石头不能和郭涛挨着,以此类推,共有几种站法?
A.120
B.48
C.240
D.144
分析:答案为C。
解题方法1:假设三对父子分别是Aa、Bb、Dd;
int main() { int i=10; int j=1; const int *p1;//(1) int const *p2=&i; //(2) p2=&j;//(3) int *const p3=&i;//(4) *p3=20;//(5) *p2=30;//(6) p3=&j;//(7) return 0; }
A.1,2,3,4,5,6,7
B.1,3,5,6
C.6,7
D.3,5
分析:答案为C。
(1)const int*p1:表示不能通过指针p1修改它指向的内存单元的值,但是p1本身可修改。
3、以下代码输出什么____.
main() { int a[5]={1,2,3,4,5}; int *p=(int *)(&a+1); printf("%d",*(p-1)); }
A.1
B.2
C.5
D.出现错误
分析:答案:C。
数组名a可以作为数组的首地址,而&a是数组的指针,那么&a+1就是表示一个指向大小为5的下一个数组的指针,也就是数组a最后一个元素的下一个位置,那么int*p=(int*)(&a+1)进行强制类型转换,将指向数组的指针转换为指向第二个数组中首元素的指针,所以p-1则是指向第一个数组中最后一个元素的指针,所以输出是5。
5、有如下C++代码:
struct A{ void foo(){printf("foo");} virtual void bar(){printf("bar");} A(){bar();} }; struct B:A{ void foo(){printf("b_foo");} void bar(){printf("b_bar");} };
那么
A *p=new B; p->foo(); p->bar();
输出为:
A.barfoob_bar
B.foobarb_bar
C.barfoob_foo
D.foobarb_fpp
分析:答案:A
A *p=newB;// A类指针指向一个实例化对象B, B类继承A类,先调用父类的无参构造函数,bar()输出bar,B类没有自己显示定义的构造函数。
6、linux下,指定文件file1为所有用户可读,可写,可执行,执行命令:___1__。修改file1的拥有者为test,拥有组为user,执行命令:___2__。
A.chmod 776,chown test
B.chmod 777,chown user
C.chmod 777,chown test
D.chmod 778,chown user
分析:答案:C。
# 改变权限
chmod
777 filepath
# 改变所有者
chown
test
filepath
# 改变所属组
chgrp
user filepath
A.prototype
B.singleton
C.flyweight
D.abstract factory
分析:答案:BC
---单例模式肯定降低了资源使用率,保证该类的实例永远只有一个!
---原型模式适用于在初始化信息不发生变换的情况,克隆的方法比较适合,主要的目的是避免重新初始化对象,如果后面需要对新对象进行,还需要区分深拷贝和浅拷贝。无论是深拷贝还是浅拷贝只是复制了资源,并没有降低资源使用率。
---抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
9、n个顶点,m条边的全连通图,至少去掉____边才能构成一棵树?
A.n-1
B.m-1
C.m-n+1
D.m-n-1
分析:答案:C。
由于n个顶点的树一定有n-1条边,所以需要去掉m-(n-1)=m-n+1条边。
10、10.在序列(22,34,55,77,89,93,99,102,120,140)中,采用二分查找,分别查找77,34,99,所需的查找次数分别为()
A.3,3,3
B.3,3,4
C.3,4,3
D.4,2,4
分析:答案:D。
22 34 55 77 89 93 99 102 120 140
A.10.0.0.0/8
B.10.1.0.0/16
C.10.1.8.0/23
D.10.1.10.0/24
分析:答案:C。
从第一位不同的开始往后全为0;后面位相同的前缀位的位数
class A{ int i; }; class B{ A *p; public: B(){p=new A;} ~B(){delete p;} }; void sayHello(B b){ } int main(){ B b; sayHello(b); }
A.程序正常运行
B.程序编译错误
C.程序崩溃
D.程序死循环
分析:答案:C。
class A{ int i; }; class B{ A *p; public: B(){p=new A;} ~B(){delete p;} /* B(const B& ths){ p = ths.p; }*/ }; void sayHello(B x){ } int main(){ B b; sayHello(b); }
这里的错误原因是编译器在生成default copy construction的时候使用的bitwise copy语义,也就是只是简单的浅拷贝。 上面被注释掉的程序就是编译器自动添加的部分。 从而导致在sayHello中向参数x传递值时,调用了bitwise copy的拷贝构造函数,使得x对象和b对象中的值完全一致,包括p指针的值,在x离开作用域(也就是sayHello函数结束),x发生析构,调用delete 销毁了指针p,同时在main函数结束的时候,析构b时又会调用一次delete删除指针p。