完美时空笔试题

以下内容来自于应聘者回忆整理

很多同学都想得到完美时空的实习或者校招机会。那从过来人的角度谈谈,要通过完美时空的实习、校招面试,都有哪些经验和注意事项呢?今天就跟大家分享一下。

总体情况: 前 5 题是 5 选 3,后 5 题不作要求 使用 C++ (VC6、VS2003、VS2005、GCC4.1.2、GCC3.2.2)或 java(JDK1.6.0)两种语言

1、编写一个 GUI 程序。在一个一定长、宽的区域内,随机分布有一定数量的矩形(边与区域的边平行,并且 一定在区域内),当鼠标在该区域内任意一点按下左键,找到所有矩形中,某个边到该点的距离最近的那个矩形, 并相对其他矩形特殊的显示出来。

2、模拟一个生产者、消费者问题,自己实现一个支持多线程、有上限的队列,附带测试代码。

3、编写一个可以计算四则运算(包含括号)程序,比如输入字符串" 1 + 2 * 3 / ( 4 - 5)" ,输出的结果为" -5" 。

4、编写一个用于局域网(同一子网)的、没有服务器的、可以多人同时聊天的程序,可以给某个人或者全部人发 送文本信息。

5、编写一个简单的 2 人点对点聊天工具,一方利用 IP 地址和端口连接另一方,可以相互发送文本信息。

对下列问题,如果不感兴趣,可以略过;如果感兴趣,可以选择性的对一个或者多个问题发表一下自己的认 识,看法等等。

1、从前有三座塔,分别命名为 X、Y、Z。其中在 Z 这座塔上,有个一定数量个盘子,比如 N 个,每个盘子的 直径都不相同,并且按自下往上、从大到小排列。现在想把 Z 塔上的盘子都移动到 X 塔上,并且移动之后,X 塔 上盘子的顺序和 Z 原来的顺序是一样的。在移动过程中,每次只能移动一个盘子;Y 也可以放盘子,但是盘子无 论放在哪座塔上,盘子必须按自下往上、从大到小排列。

基础的汉塔问题

完美时空笔试题

2、在一个 4×4 的格子中,放入 4 个棋子,使得每个棋子相同行、相同列和 2 个 45 度斜边上,都没有其它棋子。

0 1 0 0

0 0 0 1

1 0 0 0

0 0 1 0

1表示放置的地方

3、在一个圆桌上,放了 8 个盘子,每 2 个盘子中间放了一根筷子;每个盘子前站一个人,如果每人都先用左 手拿起左边的筷子,再去拿右边的筷子,因为他右边的筷子已经被他右边的人用左手拿起了,所以他没有办法凑 齐一双筷子。如果希望每个人都能在某个时刻可以凑齐一双筷子,该怎么做。

这个就是进程死锁,占用资源(左筷子),等待释放(右筷子)。

解决方案:

(1)所有人拿起左筷子后,使任意一个人<称为:小A>放下手中左筷子。(进程死锁无限等待释放资源,结束任意进程)

(2)<小A>左边的人<小B>拿起右筷子,开始吃饭。(得到资源)

(3)此人<小B>吃完,放下所有筷子。(释放资源)

(4)<小B>左边的<小C>获得筷子开始吃饭,<小B>右边的<小A>重新申请资源,获得左筷子。

(5)<小C>吃完放下所有筷子。左边<小D>得到筷子开始吃饭,右边<小B>重新申请资源,获得左筷子.

至此,死锁解除,可以一直循环,不再会存在资源占用+循环等待释放资源。

4、C++中的 const 只能在编译的时候限制为常量,如果想在程序运行的时候,做 const 的限制,有什么方法没?

首先来看看const 常量相关的编译时与运行时: C++ const 常量不同于有些语言,可以是编译时常量,也可以是运行时常量。

上边代码中指针p与const常量i的地址相同,通过p改变了该地址的值,但是从输出结果可以看到i仍然是0而j成为1,这就是所谓的编译时常量,程序在编译时都已经将i替换为0,所以后续运行时的改变不会影响i的输出,这也是编译器优化技术中的常量折叠:在编译阶段,对该变量进行值替换,同时,该常量拥有自己的内存空间,并非像宏定义一样不分配空间;而另一个k则是运行时常量,因为k的值只用在执行了函数func()之后才能得到。

再来看看跟多态相关的编译时与运行时:C++中多态分为两种,编译时多态和运行时多态,编译时多态主要指函数重载以及运算符重载等,而运行时多态主要指通过指针或引用调用虚函数达到动态绑定。注意运行时的多态只能通过虚函数的继承以及指针或者引用去调用才会实现,普通的函数、对象而不是指针或引用调用将不会起作用。

5、C++中,限制一个类的对象实例,只能在堆上分配,或者只能在栈上分配,有什么方法吗?

类对象只能建立在堆上,就是不能静态建立类对象,即不能直接调用类的构造函数。

方法一:容易想到将构造函数设为私有。在构造函数私有之后,无法在类外部调用构造函数来构造类对象,只能使用new运算符来建立对象。然而,前面已经说过,new运算符的执行过程分为两步,C++提供new运算符的重载,其实是只允许重载operator new()函数,而operator()函数用于分配内存,无法提供构造功能。因此,这种方法不可以。

方法二: 当对象建立在栈上面时,是由编译器分配内存空间的,调用构造函数来构造栈对象。当对象使用完后,编译器会调用析构函数来释放栈对象所占的空间。编译器管理了对象的整个生命周期。如果编译器无法调用类的析构函数,情况会是怎样的呢?比如,类的析构函数是私有的,编译器无法调用析构函数来释放内存。所以,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。

想要更多【技术类岗位】实习、校招的机会,请点击这里

  • 1、刺猬实习遵循行业规范,任何转载的稿件都会明确标注作者和来源
  • 2、刺猬实习的原创文章,请转载时务必注明"来源:刺猬实习",不尊重原创的行为刺猬实习或将追究责任
  • 3、作者投稿可能会经刺猬实习编辑修改或补充。

相关推荐