灵感互娱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 ~

相关推荐
好好沉淀3 小时前
1.13草花互动面试
面试·职场和发展
阿蒙Amon5 小时前
C#每日面试题-常量和只读变量的区别
java·面试·c#
程序员小白条6 小时前
面试 Java 基础八股文十问十答第八期
java·开发语言·数据库·spring·面试·职场和发展·毕设
xlp666hub7 小时前
Linux 设备模型学习笔记(1)
面试·嵌入式
南囝coding8 小时前
CSS终于能做瀑布流了!三行代码搞定,告别JavaScript布局
前端·后端·面试
踏浪无痕9 小时前
Go 的协程是线程吗?别被"轻量级线程"骗了
后端·面试·go
一只叫煤球的猫10 小时前
为什么Java里面,Service 层不直接返回 Result 对象?
java·spring boot·面试
求梦82010 小时前
字节前端面试复盘
面试·职场和发展
C雨后彩虹11 小时前
书籍叠放问题
java·数据结构·算法·华为·面试
码农水水11 小时前
中国电网Java面试被问:流批一体架构的实现和状态管理
java·c语言·开发语言·面试·职场和发展·架构·kafka