您的位置:首页 > 移动开发 > Unity3D

Unity客户端笔试题

2015-05-12 18:03 155 查看
1. 简述shell排序,快速排序,堆排序三种算法的原理? 并写出冒泡排序的算法?

2.三点15分,时针与分针夹角是多少度?

3.画出D3D9可编程渲染管线渲染流程示意图?

4.String/StringBuilder 区别?

5.说static,const,virtual,abstract,override,这几个关键字在C#中是什么意思?

const 是常量, 也就是只读的,

static:当一个方法被声明为Static时,这个方法是一个静态方法,编译器会在编译时保留这个方法的实现。也就是说,这个方法属于类,但是不属于任何成员,不管这个类的实例是否存在,它们都会存在。就像入口函数Static void Main,因为它是静态函数,所以可以直接被调用。

Virtual:当一个方法被声明为Virtual时,它是一个虚拟方法,直到你使用ClassName variable = new ClassName();声明一个类的实例之前,它都不存在于真实的内存空间中。这个关键字在类的继承中非常常用,用来提供类方法的多态性支持。

overrride:表示重写。例如:这个类是继承于Shape类。public override double Area 这个属性在shape中肯定存在,但是这里我们不想用shape中的,所以要重写,virtual,abstract是告诉其它想继承于他的类,你可以重写我的这个方法或属性,否则不允许重写。 一个生动的例子:老爸表示基类(被继承的类),儿子表示子类(继承的类) 老爸用virtual告诉儿子:“孩子,你要继承我的事业,在这块上面可以自己继续发展你自己的事业。”
儿子用override告诉全世界:“这个我可不是直接拿我爸的,他只是指个路给我,是我自己奋斗出来的!”

abstract:抽象方法声明时使用,是必须被派生类重写的方法,抽象类就是用来被继承的。可以看成是没有实现体的虚方法。如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法。抽象类不能有实体的。

interface:用来声明接口。

6.写出三种设计模式,并说说在哪些情况下适用?

7.如何使用www加载资源并使用该资源?并分析这一过程的内存开销?

8.N个元素取出最大(小)的K个元素,请说明思路及算法?

注:每个方法都有其适用范围,比如有的在N数目很大的情况下适用。每个方法都有其适用范围,比如有的在N数目很大的情况下适用。

《方法一》:

首先对元素进行排序,然后去除最大的K个元素即可。可以用基本的直接插入排序、冒泡排序,也可以用快速排序和堆排序等方法来解决。一般来说都会要求快速排序,因为该

方法综合来说是最好的。

快速排序版本1:该方法是算法导论上提出的,比较的思想是:从最开始的元素来与我们选定的元素(最右边元素)来比较,如果大于选定的元素,则不处理,如果小于选定的元素,就会往前替换。

int Partition(int A[],int p,int r) //非递减排序方法
{
int x = A[r];
int i = p-1,mid;
for(int j=p;j<r;j++)
{
if(A[j] <= x)             //寻找小于x的数据,找到以后会往前交换
{
i=i+1;
if(i!=j)               //不相等的才需要交换,算法导论上直接交换了,这里感觉可以优化
{
swap(&A[i],&A[j]);
}
}
}
swap(&A[i+1],&A[r]);
return i+1;
}
void QuickSort(int A[],int p,int r)
{
int q;
if(p<r)
{
q = Partition(A,p,r);  //得到q以后递归调用
QuickSort(A,p,q-1);
QuickSort(A,q+1,r);
}
}


快速排序版本2:一般的方法,从两边开始比较。

int Partition1(int a[],int low,int high)
{
int pivotkey;
pivotkey = a[low];                         //枢纽记录关键字
while(low < high)                                    //从表的两端交替地想中间扫描
{
while(low < high&& a[high] >=pivotkey)
--high;
a[low] = a[high];                   //将比枢纽小的移到低位
while(low<high&& a[low] <=pivotkey)
++low;
a[high] = a[low];                   //将比枢纽大的移到高位
}
a[high] = pivotkey;                          //枢纽记录到位
return high;                                 //返回枢纽位置
}
void QuickSort(int A[],int p,int r)
{
int q;
if(p<r)
{
q = Partition1(A,p,r);  //得到q以后递归调用
QuickSort(A,p,q-1);
QuickSort(A,q+1,r);
}
}
方法2:用一个最小堆来保存K个数,然后从第K+1个开始依次遍历数组,如果大于堆顶元素,则替换堆顶元素,重新调整堆。最后保留下的就是最大的K个元素。

方法3:利用hash保存数组中元素Si出现的次数,利用计数排序的思想,线性从大到小扫描过程中,前面k个数则为所求,平均情况下时间复杂度O(n)

方法4:编程之美上的思路

首先找到最大的第K个数。这个时间复杂度可以做到O(N),具体做法如下:

从N个数中随机选择一个数,扫描一遍,比n大的放在右边,r个元素,比n小的放左边,l个元素

如果: a:l = K-1 返回n

b:l > K-1 在l个元素中继续执行前面的操作。

c:l < K-1 在r个元素中继续执行前面的操作。

9.给定一个十进制正整数N,计算转换成2进制后该数含有1的个数的总和(写出代码)?

10.加入让你设计一个连连看游戏的算法,你会怎么说,要求说明:

1.怎样用简单的计算机模型来描述这个问题?

2.怎么判断俩个图形能否取消?

3. 怎么样求出相同图形之间最短路径(转弯数最少,路径经过的格子数目最少)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: