多益网络校园招聘二笔试题

2013年多益网络校园招聘笔试题

题目一:有20张上下表面光滑的扑克牌,其中有8张向上,要求你闭着眼睛且不借助任何工具把这20张扑克牌分成两堆,使得每堆向上的扑克牌的数目一样多。

解决方法:从20张扑克牌中拿出8张,并把8张扑克牌翻过来,这样两堆扑克牌向上的扑克牌数目就一样多了。

证明:

假如从20张扑克牌抽出的8张中有N张向上的扑克牌(N>=0&&N<=8)翻过来后有8-N张向上的扑克牌,

因为总共只有8张向上的扑克牌,被抽出N张向上扑克牌后,剩下8-N张向上的扑克牌,故另一堆向上的扑克牌数为8-N;

由此证明两堆向上的扑克牌数一样多。

题目二:把一个钝角三角形如何切割成最少数量的锐角三角形?

解决方法:作三角形的角平分线交于一点(内心),以内心到钝角的点为半径画圆,然后连接圆心与交点,相邻的交点也相连,这样就可得到7个锐角三角形。

二笔的题目

1。二叉排序树的问题

        第一题看到我就晕了,完全没有准备啊,二叉排序树的概念都忘记了,貌似是在树上找一个节点,使得  (节点左孩子值+右孩子值)/ 2 最小 不记得是不是这样了。

2。第二题:

        有一串玛瑙项链,项链上面有N个玛瑙珠子,这些玛瑙有M (M < = 9) 种不同的颜色,购买的时候可以只选择购买项链的一段。现在有个苦逼的找不到工作的程序员想花最少的钱买到颜色最多的一段项链,(搜索项链环),

要求时间复杂度O(n),空间复杂度O(1). 

#include <stdio.h>
#include <stdlib.h>
#define M 4 //颜色数
#define N 11    //项链珠数
int manao[N] ={1,2,1,2,3,2,4,2,3,4,1};/**判断颜色是否存在**/  
int isAll(int l,int h)
{
    int col[M] = {0};
    int i = 0;
    for( i = l ; i <= h; i++)
    {
        col[manao[i]-1] = 1;
    }
    for( i = 0 ; i < M; i++)
    {
        if( col[i] == 0)
            return 0;
    }
    return 1;
}
int GetMinManao()
{
    int l,h;    //{1,2,1,2,3,2,4,2,3,4,1};
    int count = N,ol=0,oh=0;
    for(h = l = 0 ; h < N &&  l < N ;)
    {
        if( isAll(l,h) )
        {
            if(count > h - l)
            {
                count = h - l +1;
                ol = l;
                oh = h;
            }
            l++;
        }
        else
           h++;
    }
    for(int i = ol  ; i <= oh ;i++)  
    {  
        printf("%d ",manao[i]);
    }
    printf("  count = %d ",count);
    return 1;  
}
int main()  
{
    GetMinManao();  
}


3。第三题可就坑爹了,书本后面的题目啊,经典的ACM题目里面的,


输入一个整型数组,数组里有正数也有负数。
       数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
       求所有子数组的和的最大值。要求时间复杂度为O(n)。

       例如:输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
       因此输出为该子数组的和18。



多益网络2015校园招聘第二次笔试题


LZ本人大三码农一枚,今天去参加多益网络的校园招聘2笔题,发现自己的c/c++知识还需要认真啊。话不多说上题,本次总共是5道选择题,第一题读代码题就不多说了,第二道是给出abcdef入栈,和出栈顺序,求最小栈深度,也不多说了。第三题,记不得了。 
第四题是给你一个树形结构的元素的节点树,并且知道树的叶子节点个数,将他转化为二叉树后,没有右子树的节点个数。这里就是数据结构书上的树和森林转化为二叉树的内容,可知其根节点的右孩子是为空的,而要求的没有右子树的节点则为有左子树的点,他们是父子关系。 
第五题是一到程序解答题,主要是其中有个x&(x-1)表达式,主要想说它是表示按位与。

填空题

1:c++的访问控制符包括:protected,public,private,.. 
default 
2:printf(“%x”,-1) ffffffff 用16进制表示 
%o 8进制 
3:c++中不用中间变量实现2数交换的宏定义: 
(1)加减法。
a = a + b;
b = a - b;
a = a - b;
该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失,例如对数据:
a = 3.123456
b = 1234567.000000
交换后各变量值变为:
a = 1234567.000000
b = 3.125000
很明显,原来a的值在交换给b的过程中发生了精度损失。 
4:已知一个树的前中序遍历,求后序遍历,没什么好说的 
5:一道用了memcpy和strlen的指针题目,有点难。 
6:写一个表达式判断某数N是否是2的M次幂,用n&(n-1)==0就行

大题:

1:写一个数N的M进制表示函数 我是把N%M这个余数保存在Stack里面,最后pop出来刚好是我们要的M进制字符串,如果不用这种方法用int[]把中间变量保存也行。 2:怎么判断一个链表是有环的(用两个指针实现)http://blog.csdn.net/thefutureisour/article/details/8174313详解 3:有一个函数能返回1-5的随机数,写一个能返回1-7随机数的函数 1-5 缩小区间到0-4 增大到0-6 再加1 4:给你一个链表的根节点指针和一个节点指针,写一个删除这个节点的函数实现O(1) 5:给你一个String类 让你实现其中的成员函数。他给了2个构造函数String(char * root =null)和String(const String &csda)还有一个析构函数,以及一个OverLoad的=赋值运算符。

    前天笔试完,今天LZ就去面试了。地点什么的就不说了,直接上干货。

1:Leader:你有女朋友?(这也是程序员会问的?我感到有点突然。。。。)

    Me::额 ,有

         你女朋友来会来多益吗?

         会啊。

          你女朋在干嘛?

          读书啊。好吧他就没问了。

2:你说一下你讨厌的人(LZ本生没讨厌过谁啊,怎么说,难道一定要讨厌别人才行?)

     说一下你讨厌的性格。

      高调的人吧。

      完了?

      恩。

3:解释下二位数组和一维数组寻址

二维数组与一维数组不同之处在于,a+i在二维数组里表示第i行数组的首地址,或者是&a[i][0],并且*(a+i)也表达了同样的地址(&a[i][0])。要想表达a[i][j]的地址,要么用a[i]+j,要么用*(a+i)+j,切莫用a+i+j(这是表示a[i+j][0]的地址)。

一位数组,a+2指的是a[3]的地址

4:说一下HTTP的连接过程。

直接上三次握手,四次挥手。 服务器预留资源等等

5:你知道设计模式哈?说一下常用的。

单例,工厂,观察者,适配器。 简单说了下

public class Singleton{

private static Singleton instance;

private Singleton(){

}

 public static synchronized Singleton getinstance(){

if(instance == null){

instance = new singleon();

}

return instance;

}

6:c++虚函数的作用

LZ不怎么了解c=+

http://zhidao.baidu.com/link?url=ISBmeOylPwar-Ku7Gwsko_IGCIgwRe798WeYKshOhGXCxHn_Mjh28PiLMfvCJaPoF1u2whbb7e2sLVMBjJeeTq

大概就是实现多态的,也就是Java的抽象函数和接口之类的

7:解释下堆栈溢出。多半说的是c++,java的话也分本地方栈和虚拟机栈,一般就是jvm栈。

百度了下,大家可以看下:

一般每个进程的栈空间是限定的。(为什么限定?去学汇编和操作系统就知道)
什么占用栈空间?
除去系统栈占用外,基本就是栈变量。(什么是栈变量?无语¥%*&……%¥%&)
简单来说上面那个a就是栈变量。
修改有两个办法:
一 改为堆变量:
int* pa = malloc(sizeof(int)*1000*1000);
然后可以将pa当数组用。(数组和指针在C里基本等同)
当然,不用了记得free pa。
二  修改系统限制
这个栈变量= 1000*1000*4 = 4M。(约等于)
如果这个函数不频繁调用,也不递归,一般还是可以接受。
可以修改操作系统对进程栈空间的大小限制,稍微调大一些。
ulimit查看系统的限制。(*nix系统命令。不是windows的)


大概意思就是:

1.没有回收垃圾资源

2.层次太深的递归调用

但是在java中堆栈的应用是这养的

http://blog.csdn.net/chengyingzhilian/article/details/7781858

8:设计一下NPC处购买道具的过程

具体说自己的想法

9:怎么去写碰撞条件  准确的说是没有做过游戏开发

10:你有没有offer现在?  确实他们招的比较早,也是我第一家公司,所以我说没有

然后他说时间到了,拜拜了



2016多益网络春季实习校园招聘笔试回顾(C++游戏后台开发)


2016.04.16晚中山大学大学城校区参加了多益网络的C++游戏后台开发的笔试。有几道笔试题还是值得斟酌和记录的,特记录如下。比较可惜,因为回老家了,未能参加多益的面试。

1.试题汇总

题目一: 
给定代码段int A[2][3]={1,2,3,4,5,6};那么A[1][0]和*(*(A+1)+1)的值分别是什么? 
答: 
A[1][0]=4,*(*(A+1)+1)=5。 
这里考察了对二维数组的理解和指针运算。A[1][0]=4比较好理解。但是对二维数组A进行指针运算时,我们要知道二维数组A的类型是什么,考察如下代码:

int A[2][3]={1,2,3,4,5,6}; cout<<"sizeof(A):"<<sizeof(A)<<“ ”<<typeid(A).name()<<endl;

VS2012中代码输出 sizeof(A):24 int [2][3]。可见二维数组A的类型是int[2][3],所以sizeof(A)=sizeof(int)*6=24。

知道了A的类型是int[2][3]之后,当我们对数组A进行指针运算时,那么A就会退化为指针,它的类型变为int(*)[3],验证代码如下:

cout<<"sizeof(A+1):"<<sizeof(A+1)<<" "<<typeid(A+1).name()<<endl;cout<<"sizeof(*(A+1)):"<<sizeof(*(A+1))<<endl;

输出结果为: 
sizeof(A+1):4 int (*)[3] 
sizeof(*A):12 int [3]

所以*(A+1)表示的是二维数组的第二行,其类型是int[3]。可将*(A+1)取个别名,容易理解,*(A+1)=int a[3],此时在对变量*(A+1)进行指针运算时,就相当于对一维数组a进行进行指针运算。那么*(a+1)的值就是二维数组A的第二行的第二个数5。

是有点绕,不过一定要好好理解,才能掌握数组与指针之间的区别与联系。这里有一点一定要记住:当对数组进行指针运算时,其会退化为指针。

题目二: 
下面代码的作用是什么?

doublex,ret=0;for(inti=1;scanf("%lf",&x)==1;++i){ ret+=(x-ret)/i; }

答: 
这段代码真的很精妙,其作用就是求标准输入双精度浮点数和的平均值。按照顺序走几遍循环就可以了。比如输入的值为a,那么结果ret=a,第二次输入值为b,那么: 

ret=b−a2+a=a+b2
假如第三次输入的是c,那么: 
ret=a+b2+c−a+b23=a+b+c3

以此类推,可以知道上面的代码是求输入双精度浮点数和的平均值。

题目三: 
在一个平面坐标系中,从方格(0,0)移动到方格(6,6),每次只能向上移动或者向右移动,且每次只能移动一个方格,且不能经过(2,3)和(4,4)两个方格,有多少种移动的方式。 
答: 
这道题本质是组合问题。解题思路: 
(1)算出从方格(0,0)到方格(6,6)总共有多少种移动的方式; 
(2)减去经过(2,3)和(4,4)的所有路径。

从方格(0,0)移动到方格(6,6)的移动次数是12次,每次都选择向右还是向上。因此向右只能选择6次,所以总的移动次数设为 countAll=C612=924种。

按照上面的计算方式,(0,0)到(2,3)有 C25 种,再从(2,3)到(6,6)有 C47 种。所以经过方格(2,3)从(0,0)移动到(6,6)的移动方式 countA=C25C47=350 种。

同理,经过方格(2,3)从(0,0)移动到(6,6)的移动方式 countB=C48C24=420 种。

同理,同时经过(2,3)和(4,4)的移动方式 countAB=C25C13C24=180 种。

因为经过(2,3)的路径中有可能经过(4,4),反之亦然。所以减去countA和countB时,会多减去一次同时经过(2,3)和(4,4)的移动方式数countAB,所以最终结果是: 
count=countAll−countA−countB+countAB=924−350−420+180=334 $。

新加评论 评论标题:

填空题
大题: