灵感互娱U3D笔试题

文章目录

题目1

以下C#代码的输出顺序是什么

cs 复制代码
namespace ConsoleApp2
{
  internal class Program
  {
    class A
    { 
      public A(string text)
      {
        Console.WriteLine(text);
      }
    }

    class B
    {
      static A a1 = new A("1");
      A a2 = new A("2");

      static B()
      {
        a1 = new A("3");
      }

      public B()
      {
        a2 = new A("4");
      }

    }

    static void Main(string[] args)
    {
     var b = new B();
    }
  }
}

解析

  1. 创建类B实例
cs 复制代码
var b = new B();
  1. 访问类B时,触发静态字段 a1 初始化:
cs 复制代码
static A a1 = new A("1");

输出1

  1. 执行类B的静态构造函数:
cs 复制代码
static B()
{
    a1 = new A("3");
}

输出: 3

  1. 实例化字段 a2 初始化:
cs 复制代码
A a2 = new A("2");

输出: 2

  1. 执行类B 的实例构造函数:
cs 复制代码
public B()
{
    a2 = new A("4");
}

输出: 4

考点:解析类的构造函数和初始化顺序来理解输出顺序。

答案:1、3、2、4


题目2

下面程序的输出结果

cs 复制代码
namespace ConsoleApp2
{
  internal class Program
  {
    struct DataStruct
    {
      public int data;
      public DataStruct(int d)
      { data = d; }
    }

    static void Main(string[] args)
    {
     List<DataStruct> structs = new List<DataStruct>();
      structs.Add(new DataStruct(1));
      structs.Add(new DataStruct(3));
      DataStruct dataStruct = structs[1];
      dataStruct.data = 2;
      Console.WriteLine(structs[1].data);
    }
  }
}

解析

重点在于

cs 复制代码
DataStruct dataStruct = structs[1];
dataStruct.data = 2;

structs[1]是否会被赋值为2,不会,因为这仅仅是修改了dataStruct,structs[1]还是为3


题目3

下列代码执行结果是什么

cs 复制代码
using System.Diagnostics;

namespace ConsoleApp2
{
  internal class Program
  {
    public class BaseClass
    {
      private int i;

      public BaseClass(int _i)
      {
        i = _i + 1;
      }

      public int GetI()
      {
        return i;
      }

      public virtual int GetIVal() 
      {
        return i;
      }
    }

    public class SubClass : BaseClass
    {
      private int i;
      public SubClass(int _i) : base(_i)
      {
        i = _i + 100;
      }
    }

    static void Main(string[] args)
    {
      SubClass sc = new SubClass(1);
      BaseClass bc = sc as BaseClass;
      Console.WriteLine($"GetI={sc.GetI()},GetIVal={bc.GetIVal()}");
    }
  }
}

解析

基类 BaseClass子类 SubClass 各有自己的 i 字段,但 SubClass 的 i 在 SubClass 内部使用


题目4

链表和数组的区别

数组

  1. 内存分配
    连续内存: 数组中的元素在内存中是连续存放的。
    固定大小: 数组的大小在创建时必须指定,并且在大小固定的情况下使用。
  2. 访问方式
    随机访问: 通过索引可以直接访问数组中的任何元素。
    复杂度: 查找第 n 个元素的时间复杂度为O(1)
  3. 插入和删除
    低效的插入和删除: 在数组中间插入或删除元素需要移动大量元素,因此时间复杂度通常为 O(n)。
    固定位置操作: 只能在已分配的空间范围内进行插入和删除,不能动态增长或收缩。
  4. 存储空间
    内存紧凑: 仅包含元素的数据部分,没有额外的指针开销。
  5. 类型
    一维数组: 简单的线性结构。
    多维数组: 可以是二维、三维等,形成矩阵或更高维的结构。
  6. 优缺点
  • 优点:
    访问速度快,可以直接通过索引访问。
    内存紧凑,没有额外的指针开销。
  • 缺点:
    大小固定,无法动态扩展或缩减。
    插入和删除操作较慢,特别是在数组中间操作时。

链表

  1. 内存分配
    非连续内存: 链表中的元素(节点)在内存中可以不连续存放。
    动态大小: 链表可以随时动态增长或收缩,无需预先定义大小。
  2. 访问方式
    线性访问: 访问链表中的元素需要从头节点(Head)开始逐个遍历,直到找到目标节点。
    复杂度: 查找第 n 个元素的时间复杂度为 O(n)。
  3. 插入和删除
    高效的插入和删除: 在链表中,插入和删除操作只需修改相关节点的指针,不涉及大量的移动。时间复杂度通常为 O(1)(在已知位置的情况下)。
    动态操作: 插入和删除可以在任意位置进行,且这些操作不会涉及对其他元素的移动。
  4. 存储空间
    额外开销: 每个节点除了数据外,还需要存储一个或两个指针(单向链表或双向链表),这会增加内存开销。
  5. 类型
    单向链表: 每个节点有一个指针指向下一个节点。
    双向链表: 每个节点有两个指针,分别指向前一个和后一个节点。
    循环链表: 最后一个节点指向第一个节点,形成一个环。
  6. 优缺点
  • 优点:
    动态大小,无需预先定义。
    插入和删除操作高效,尤其是在头部和中间。
  • 缺点:
    访问元素速度慢,无法直接按索引访问。
    额外的内存开销用于存储指针。

题目5

下列代码是否正确

cs 复制代码
using System.Diagnostics;

namespace ConsoleApp2
{
  internal class Program
  {
    static void Main(string[] args)
    {
      List<int> ls= new List<int>(new int[] { 1,2,3,4,5 });
      foreach (int i in ls)
      {
        if (i == 4)
        { 
         ls.Remove(i);
        }
      }
    }
  }
}

解析

不正确

不能修改集合: 使用 foreach 遍历集合时不能对集合进行修改(增删)。否则会报InvalidOperationException错误


题目6

简述向量点乘和叉乘的几何意义?

解析

特性 点乘 叉乘
结果类型 标量 向量
几何意义 度量两个向量的相似度 计算平行四边形面积,得到垂直向量
公式 A·B = |A| |B| cosθ |A x B| = |A| |B| sinθ
结果符号 正、负、零 向量,符号依据右手定则
应用 计算夹角、投影、方向判断 计算面积、法向量、共面性判断

题目7

打印6*6乘法表,请严格按照下面格式输出,并注意程序效率。

md 复制代码
1*1=1 2*1=2 3*1=3
1*2=2 2*2=4 3*2=6
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12
1*5=5 2*5=10 3*5=15
1*6=6 2*6=12 3*6=18

4*1=4 5*1=5 6*1=6
4*2=8 5*2=10 6*2=12
4*3=12 5*3=15 6*3=18
4*4=16 5*4=20 6*4=24
4*5=20 5*5=25 6*5=30
4*6=24 5*6=30 6*6=36

解析

cs 复制代码
using System.Diagnostics;

namespace ConsoleApp2
{
  internal class Program
  {
    static void Main(string[] args)
    {
      for (int row = 1; row <=6; row++)
      {
        for(int col = 1; col <=3; col++)
        {
          int res = row * col ;
          Console.Write($"{col}*{row}={res}");
          if (col < 3 && res.ToString().Length >= 2)
          {
            Console.Write(" ");
          }
          else if (col < 3 && res.ToString().Length < 2)
          {
            Console.Write("  ");
          }
        }
        Console.WriteLine();
      }
      Console.WriteLine();
      for (int row = 1; row <= 6; row++)
      {
        for (int col = 4; col <= 6; col++)
        {
          int res = row * col;
          Console.Write($"{col}*{row}={res}");
          if (col < 6 && res.ToString().Length >= 2)
          {
            Console.Write(" ");
          }
          else if(col < 6 && res.ToString().Length < 2)
          {
            Console.Write("  ");
          }
        }
        Console.WriteLine();
      }
    }
  }
}

题目8

写一个求斐波那契数列的函数。请充分考虑时间和空间效率,且示例的函数调用能执行成功。

斐波那契数列:1、1、2、3、5、8、13、21、34 ······

解析

给定 n ,请计算 F(n) 。F(n)=F(n-1)+F(n-2)

cs 复制代码
public int Fib(int n) 
{
    int pre=0;
    int next=1;
    int sum;
    for(int i = 0;i < n;i++)
    {
        sum=pre+next;
        pre=next;
        next=sum;
    }
    return pre;
}

后话

考的题目比较基础!

enjoy it ~

相关推荐
鱼跃鹰飞6 小时前
大厂面试真题-简单说说线程池接到新任务之后的操作流程
java·jvm·面试
程序员清风9 小时前
浅析Web实时通信技术!
java·后端·面试
测试199810 小时前
外包干了2年,快要废了。。。
自动化测试·软件测试·python·面试·职场和发展·单元测试·压力测试
mingzhi6111 小时前
渗透测试-快速获取目标中存在的漏洞(小白版)
安全·web安全·面试·职场和发展
嚣张农民11 小时前
一文简单看懂Promise实现原理
前端·javascript·面试
Liknana13 小时前
Android 网易游戏面经
android·面试
威哥爱编程16 小时前
MongoDB面试专题33道解析
数据库·mongodb·面试
程序猿进阶17 小时前
Redis 基础数据改造
java·开发语言·数据库·redis·后端·面试·架构
刘艳兵的学习博客18 小时前
刘艳兵-DBA027-在Oracle数据库,通常可以使用如下方法来得到目标SQL的执行计划,那么通过下列哪些方法得到的执行计划有可能是不准确的?
数据库·oracle·面试·database·刘艳兵