MIL22——模拟面试题

C#

  1. C# 中在字符串前面加一个 @​ 符号或者 $ 符号有什么作用

  2. C# 中提供了序列化和反序列化 2 进制数据的公共类 BinaryFormatter
    为什么我们一般还要自己去实现序列化和反序列化 2 进制数据的方法?

  3. 异或加密的原理是什么?请简要说明

  4. 下面的函数是判断一个整数是不是 2 的 n 次方。请问 if 语句中应该如何书写

    1
    2
    3
    4
    5
    6
    static bool isPowerOfTwo(uint num)
    {
    if (/*...*/)
    return true;
    return false;
    }
  5. 有 1000 瓶水其中一瓶是有毒的,喝下后 24 小时后才死,现在用小白鼠来测试哪一瓶有毒。
    最少需要用多少只小白鼠才能测出哪一瓶是有毒的水(需要在 24 小时后出结果,不能用几天时间来测试)

Unity

  1. 有 1000 瓶水其中一瓶是有毒的,喝了马上死,现在用小白鼠来测试哪一瓶有毒。最少需要用多少只小白鼠才能测出哪一瓶是有毒的水
  2. 如何为 UGUI 中的某一个控件添加自定义事件监听(比如为一个 Image 添加点击事件)
  3. 我们在进行 UI 开发时,每个面板都会有很多控件(Button​、Toggle​、Slider 等等)
    每新写一个面板逻辑,都会为这些控件做一些相同的事情,比如:声明控件、查找控件、监听控件等等
    请问:我们应该如何提升我们的开发效率,让这些事情不用每次都去做?(至少说出两种方案)
  4. 正交矩阵的基本概念是什么?它对我们来说有什么意义?
  5. Shader和材质球的关系是什么?

答案

C#

  1. C# 中在字符串前面加一个 @​ 符号或者 $ 符号有什么作用

    @​ 符号:让转义字符失效
    $​ 符号:插值字符串,可以在字符串中加入 {变量名} 插入变量值

  2. C# 中提供了序列化和反序列化 2 进制数据的公共类 BinaryFormatter
    为什么我们一般还要自己去实现序列化和反序列化 2 进制数据的方法?

    • 主要原因:

      希望数据跨语言,BinaryFormatter​ 是 C# 的特定格式,不同的语言之间可能无法良好的兼容自定义数据可以让数据跨语言,
      在网络通讯时,后端的语言大多数情况下不是 C#,我们应该和后端一起置顶序列化和反序列化的规范

    • 次要原因:

      1. 更容易进行加密处理
      2. 节约空间,BinaryFormatter 会包含一些除数据以外的额外信息

    等等

  3. 异或加密的原理是什么?请简要说明

    异或加密是一种简单的对称加密算法。原理就是基于异或运算,相同为0,不同为1。
    异或加密时会有一个固定的密钥,想要加密的数据与该密钥进行异或运算得到加密后的数据
    加密后的数据再和密钥进行异或运算得到原数据(解密后的数据)

    举例:
    假设原数据为:1010
    密钥为:1100
    加密后的数据为:1010 ^ 1100 = 0110
    解密数据:0110 ^ 1100 = 1010

  4. 下面的函数是判断一个整数是不是 2 的 n 次方。请问 if 语句中应该如何书写

    1
    2
    3
    4
    5
    6
    static bool isPowerOfTwo(uint num)
    {
    if (/*...*/)
    return true;
    return false;
    }

    答:(num & num - 1) == 0 && num >= 0

  5. 有 1000 瓶水其中一瓶是有毒的,喝下后 24 小时后才死,现在用小白鼠来测试哪一瓶有毒。
    最少需要用多少只小白鼠才能测出哪一瓶是有毒的水(需要在 24 小时后出结果,不能用几天时间来测试)

    image

Unity

  1. 有 1000 瓶水其中一瓶是有毒的,喝了马上死,现在用小白鼠来测试哪一瓶有毒。最少需要用多少只小白鼠才能测出哪一瓶是有毒的水

    image

  2. 如何为 UGUI 中的某一个控件添加自定义事件监听(比如为一个 Image 添加点击事件)

    UGUI 中的 EventTrigger

  3. 我们在进行 UI 开发时,每个面板都会有很多控件(Button​、Toggle​、Slider 等等)
    每新写一个面板逻辑,都会为这些控件做一些相同的事情,比如:声明控件、查找控件、监听控件等等
    请问:我们应该如何提升我们的开发效率,让这些事情不用每次都去做?(至少说出两种方案)

    • 方案一:制作自动生成代码的工具,将声明控件、查找控件、监听控件这些事情自动生成
    • 方案二:创建面板基类,在基类中进行统一处理,新面板只需继承该基类,基类代码就可以帮助我们完成声明控件、查找控件、监听控件这些事情
  4. 正交矩阵 的基本概念是什么?它对我们来说有什么意义?

    • 基本概念:正交矩阵是一种特殊的方阵
      一个方阵和它的转置矩阵相乘为单位矩阵,那么它就是正交矩阵
      如果一个矩阵是正交矩阵,那么它的转置矩阵也是正交矩阵
    • 对我们的意义: 如果一个矩阵是正交的,那么它的逆矩阵等于其转置矩阵,可以非常方便的进行逆运算,用于取消之前的变换
  5. Shader 和材质球的关系是什么?

    1. 一个 Shader 可以与无数个材质关联。
    2. 一个材质同一时刻只能关联于一个 Shader。(为什么说是同一时刻,因为我们可以通过代码去动态改变材质所关联的Shader)
    3. 材质可以赋与模型,但是 Shader 不行。
    4. 材质就像是 Shader 的实例,每个材质都可以参数不一样呈现不同的效果,但是当 Shader 改变时,关联它的所有材质都会相应的改变。

    举个例子:比如游戏中的怪物,我们只需做一个 Shader,然后每个怪物给它一个材质球,材质球上赋与不同的贴图与参数来表现不同的怪物。