面试问题

C#

  1. List 怎么排序

    List.Sort

  2. 自定义数据的 List 能排序吗,怎么排序

    实现 IComparable 接口

  3. 动态数组如何添加数据,如何移除数据,例如删掉所有 5

    添加数据直接 Add 即刻,但是 remove 要从尾部往前遍历删除,因为顺序执行会再删除元素后,index改变。

    1. 能不能详细说下添加元素是内部会进行过什么操作

      首先会判断容器容量是否足够,不足够会重新申请内存空间,大小为原来的两倍,并将原元素存储到新空间后,再添加新元素。

    2. 移除能怎么优化吗

      和批一起移除

  4. as 和 is 的区别

    as 会尝试进行类型转换,is 只是类型判断

  5. arrayList 和 list 的区别,使用上有什么区别

    arrayList 是以 Object 存储数据的,所以存储数据方便。但是存取就有装箱拆箱操作,比较消耗性能。List 则指定一种类型,没有装拆箱操作。

  6. delegate 和 event 有什么区别

    event 是对 delegate 再深一层封装,对delegate进行 = 号操作是允许的,并且会覆盖所有delegate的内容,event 则只允许加减,相对安全很多

  7. 结构体 和 Class 有什么区别

    结构体值类型,class 引用类型

    1. 引用类型和值类型有什么区别

      值类型存储再程序被分配的栈,所在的函数声明周期结束后就会回收,引用类型则分配在堆区,程序关闭才会回收。

    2. 如果结构体的构造函数是传递一个类对象,对两个结构体传递同一个类对象,通过其中一个结构体改变类对象的值,会影响另一个吗?

      会,因为引用是同一个。

  8. 如何判断回文字,abccba 这种?怎么简单怎么来

    C# 中用 string.reverse 反转字符串,比较一下就好了。

    1. 如果不能用自带函数,怎么处理

      双指针,左一个右一个,在相交前都一样则是回文

数据结构

  1. 说一下你知道的数据结构,都有什么特点

    • 数组:结构简单,访问速度快,占用内存小,但是查找较慢,增删影响偏大(需要重构数组)
    • 链表:增删简单,占用内存偏大一点,访问速度一般。
    • 队列:有先进先出的特性,适合做消息处理
    • 栈:先进后出
    • 堆:非严格的大小关系,对于求前n大的问题消耗较少,维护也快,
    • 树:天然二分,具有查找属性,快,维护也相对相对简单。
    • 哈希表:字典,查找最快
    1. 用过哪些

      数组:无

      链表:删除节点,先找到要出节点的前一个结点,将前一个结点的 next ,指向删除节点的next。

      哈希表:哈希表大致是如何工作的,冲突怎么处理。构建哈希函数,通过元素直接得到 index,如果没冲突,可以直接返回元素,若有冲突,可以再冲突位置建立链表或数组,链地址冲突解决法。对发生冲突的位置在进行一个个匹配。

      堆:大顶堆,怎么增加一个节点。在尾添加节点,然后判断当前的堆属性,如果节点比父节点大,则交换位置后,对新位置继续判断堆属性。无需和同级节点判断,因为堆的属性,父节点是大的即可。

算法

  1. 冒泡

    对比相邻的元素,如果大小反向,就交换位置,一直匹配到最后 能优化吗?每次匹配,记一个是否交换过的标记,如果一轮下来,没有改过,说明已经有序,直接返回

    n平方级别

  2. 选择排序

    每次遍历选出最值,和当前的替换位置。

    n平方级别

  3. 桶排序

    复杂度n+c,c为 N * (logN - logM)

  4. 快排

    去第一为基准值,设置左右两指针i,j,j从右往左找,找到第一个小于基准值的,将当前值复制到i上,还i从左往右找,找到第一个大于基准值的,将值复制到j上,如此往复,知道 i == j 时,将基准值放到 a[i] 上

    log(n)级别

Unity

  1. 说一下你知道的 Unity 脚本生命周期
  • Awake
  • OnEnable
  • Start
  • FixedUpdate 固定间隔
  • OnTriggerXXX 当触发器发生碰撞
  • OnCollisionXXX 当碰撞体发生碰撞
  • OnMouseXXX 鼠标事件
  • Update 渲染
  • LateUpdate
  • OnGUI Unity前GUI系统回调,现多用于调试
  • Yield WaitForEndOfFrame
  • OnDisable
  • OnDestroy
  1. UGUI 熟悉吗

    1. 按钮怎么添加监听事件

      addlistener

    2. 能不能自己写个按钮

      能实现 IpointerClick 接口就行了

  2. Unity布局组建用过吗

    horizontalLayout,verticalLayout,gridLayout

  3. 知道 Draw call 吗,为什么会出现要清 Dc 的情况,大致怎样清

  4. 如果要显示一个倒计时30分钟的秒表,精确到秒,怎么实现。

  5. 你知道有哪些控制 2D 元素的层级方法

  6. 有没有用过对象池,怎么理解对象池,如果你设计会怎么做。

  7. 你有什么办法寻找一个对象。

1、物理更新一般在哪个系统函数里 FixUpdate 2、String StringBuilder有什么区别 String是字符串常量。StringBuilder是字符串变量。String类型是个不可变的对象,连接操作频繁的时候,使用StringBuilder对象。StringBuilder的优势在于拼接,string的优势在于对字符串做一些处理 3、MonoBehaviour的生命周期几个常见函数 4、值类型和引用类型的区别 值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中 值类型表示实际数据;引用类型表示指向存储在内存堆中的数据的指针或引用 值类型继承自System.ValueType;引用类型继承自System.Object 5、设计模式 单例模式 6、物体发生碰撞时,有几个阶段,分别对应的函数 进入碰撞OnCollisionEnter 停留碰撞OnCollisionStay 退出碰撞OnCollisionExit 7、如何让GameObject在LoadLevel后不被卸载掉 8、Unity3D的协程和C#线程之间的区别 多线程程序同时运行多个线程,而在任一指定时刻只有一个协程在运行,并且这个正在运行的协同程序只在必要时才被挂起。 除主线程之外的线程无法访问Unity3D的对象、组件、方法。 Unity3D没有多线程的概念,不过Unity也给我们提供了StartCoroutine(协同程序)和LoadLevelAsync(异步加载关卡)后台加载场景的方法。 StartCoroutine为什么叫协同程序,所谓协同,就是当在StartCoroutine的函数体里处理一段代码时,利用yield语句等待执行结果,这期间不影响主程序的继续执行,可以协同工作。 9、OnEnable、Awake、Start运行时的发生顺序 【Awake()】=>【OnEnable()】=>【Start()】

Comments