灵感互娱U3D笔试题

题目1

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

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实例
var b = new B();
  1. 访问类B时,触发静态字段 a1 初始化:
static A a1 = new A("1");

输出1

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

输出: 3

  1. 实例化字段 a2 初始化:
A a2 = new A("2");

输出: 2

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

输出: 4

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

答案:1、3、2、4


题目2

下面程序的输出结果

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);
    }
  }
}

解析

重点在于

DataStruct dataStruct = structs[1];
dataStruct.data = 2;

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


题目3

下列代码执行结果是什么

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

下列代码是否正确

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乘法表,请严格按照下面格式输出,并注意程序效率。

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

解析

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)

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 ~

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值