文章目录
- 题目1
- 解析
- 题目2
- 解析
- 题目3
- 解析
- 题目4
- 数组
- 链表
- 题目5
- 解析
- 题目6
- 解析
- 题目7
- 解析
- 题目8
- 解析
- 后话
题目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();
}
}
}
解析
- 创建
类B
实例
var b = new B();
- 访问
类B
时,触发静态字段a1
初始化:
static A a1 = new A("1");
输出1
- 执行
类B
的静态构造函数:
static B()
{
a1 = new A("3");
}
输出: 3
- 实例化字段
a2
初始化:
A a2 = new A("2");
输出: 2
- 执行
类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
链表和数组的区别
数组
内存分配
连续内存: 数组中的元素在内存中是连续存放的。
固定大小: 数组的大小在创建时必须指定,并且在大小固定的情况下使用。访问方式
随机访问: 通过索引可以直接访问数组中的任何元素。
复杂度: 查找第 n 个元素的时间复杂度为O(1)
。插入和删除
低效的插入和删除: 在数组中间插入或删除元素需要移动大量元素,因此时间复杂度通常为 O(n)。
固定位置操作: 只能在已分配的空间范围内进行插入和删除,不能动态增长或收缩。存储空间
内存紧凑: 仅包含元素的数据部分,没有额外的指针开销。类型
一维数组: 简单的线性结构。
多维数组: 可以是二维、三维等,形成矩阵或更高维的结构。优缺点
- 优点:
访问速度快,可以直接通过索引访问。
内存紧凑,没有额外的指针开销。 - 缺点:
大小固定,无法动态扩展或缩减。
插入和删除操作较慢,特别是在数组中间操作时。
链表
内存分配
非连续内存: 链表中的元素(节点)在内存中可以不连续存放。
动态大小: 链表可以随时动态增长或收缩,无需预先定义大小。访问方式
线性访问: 访问链表中的元素需要从头节点(Head)开始逐个遍历,直到找到目标节点。
复杂度: 查找第 n 个元素的时间复杂度为 O(n)。插入和删除
高效的插入和删除: 在链表中,插入和删除操作只需修改相关节点的指针,不涉及大量的移动。时间复杂度通常为 O(1)(在已知位置的情况下)。
动态操作: 插入和删除可以在任意位置进行,且这些操作不会涉及对其他元素的移动。存储空间
额外开销: 每个节点除了数据外,还需要存储一个或两个指针(单向链表或双向链表),这会增加内存开销。类型
单向链表: 每个节点有一个指针指向下一个节点。
双向链表: 每个节点有两个指针,分别指向前一个和后一个节点。
循环链表: 最后一个节点指向第一个节点,形成一个环。优缺点
- 优点:
动态大小,无需预先定义。
插入和删除操作高效,尤其是在头部和中间。 - 缺点:
访问元素速度慢,无法直接按索引访问。
额外的内存开销用于存储指针。
题目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 ~