面向对象
调试和错误处理 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768--1.单个try catch异常捕捉//try块:包含可能会抛出异常的代码。这是需要被监视的代码段,如果其中的代码引发异常,程序将立即跳转到相应的catch块进行异常处理 //catch块:当try块中抛出异常时,程序会根据异常的类型,查找与之匹配的catch块进行处理。如果异常类型匹配,程序将执行该catch块中 的代码。可以使用多个catch块来处理不同类型的异常。//finally块:无论try块中是否抛出异常,finally块中的代码都会被执行。通常用于释放资源,如关闭文件、释放数据库连接等,确保资源的正确释放class Program{ static void Main() { try { // 可能...
数据结构
动态数组 装箱:装箱是指将值类型转换为引用类型的过程。值类型(如 int、char、struct 等)通常存储在栈上,而引用类型存储在堆上。当进行装箱操作时,会在堆上为值类型创建一个对象实例,并将值类型的值复制到该对象中,最后返回这个对象的引用。 拆箱:拆箱则是将引用类型转换为值类型的过程。它需要先检查引用类型是否为某个特定值类型的装箱实例,然后将堆上对象中存储的值复制到栈上的新值类型变量中。 装箱开销:装箱操作会在堆上分配内存,并且需要复制值类型的值,这会带来一定的性能开销,尤其是在频繁进行装箱操作时,会导致内存分配和垃圾回收的压力增加。 拆箱开销:拆箱操作需要进行类型检查,确保引用类型确实是某个值类型的装箱实例,这也会带来一定的性能开销。 动态数组指的是是大小能在程序运行期间动态调整的数组,可根据实际需求增添或删减元素。与固定大小的数组不同,动态数组能够灵活应对元素数量的变化,从而更高效地管理内存。以下通过自定义的类实现动态数组,使用泛型类,来进行动态数组的实现,这样可以根据数组的类型,实现相应的功能,同时实现IEnumerable接口,可以被foreach循环遍历...
基本语法
基础语法(C#)12345678910111213//最基础的C#程序结构如下using System;namespace CSharp_project{ class Program { static void Main(string[] args) { Console.WriteLine("Hello"); } }} 12345678910111213using System; //引入命名空间 Console 属于Systemnamesapce //包含了一系列的类class //包含了程序使用的数据和方法声明、Console.WriteLine(""); //输入到控制台上(输出语句)Console.Write("");//bConsole.WriteLine(@"");//添加@后 转义字符不生效string s...
链表面试题
判断链表是否为回文1.使用容器栈来进行,将所有的数据压入栈,在一个一个出栈与链表进行比较,只要不相同就直接return false 123456789101112131415161718public bool isTenet(Node head){ Stack<int> Contains = new Stack<int>(); Node cur = head; while (cur != null) { Contains.Push(cur.e); cur = cur.next; } cur = head; while (cur != null) { if (Contains.Pop() != cur.e) return false; cur = cur.next; } return true;} 2.翻转后端链表,使用快慢指针找到中间节点,找到后翻转后半部分的...
贪心算法
贪心算法(堆,排序)贪心算法是一种在每一步选择当前最优解,从而希望最终得到全局最优解的算法策略。它的核心思想是局部最优导致全局最优,即在每个决策阶段选择对当前最有利的选项,而不考虑未来的影响 贪心算法的基本特点 特点 说明 局部最优选择 每一步都选择当前看起来最好的解 无后效性 当前的选择不会影响未来的选择 不可回退 一旦做出选择,就不能撤销(不像回溯算法) 高效性 通常时间复杂度较低,适用于大规模问题 贪心算法不一定能得到全局最优解,只有在满足以下两个条件时才能保证最优性: (1) 贪心选择性质(Greedy Choice Property) 当前的最优选择能导致全局最优解。 即:局部最优解包含在全局最优解中。 (2) 最优子结构(Optimal Substructure) 问题的最优解包含其子问题的最优解。 即:全局最优解 = 当前最优选择 + 子问题的最优解。 贪心算法 vs 动态规划(DP) 对比项 贪心算法 动态规划 决策方式 每一步选择当前最优 考虑所有可能的子问题 最优性 不一定全局最优(除非满足贪心条件) 保...
简单排序
前几种时间复杂度为O(n * n)的排序 选择排序 12345678910111213141516171819202122232425public static void SeletSort(int[] arr){ if (arrs == null || arrs.Length < 2) return; for(int i = 0; i < arr.Length;i++){ int newIndex = i; for(int j = i+1;j<arr.Length;j++){ newIndex = arr[j] < arr[newIndex] ? j:newIndex; } Swap(arr,i,newIndex); }} public static void Swap(int[] arr, int i, int j) { int temp = arr[j]; arr[j] = a...
归并排序
迭代归并排序123456789101112131415161718192021222324252627282930313233343536public void Sort(int[] arrs, int L, int R) { int step = 1; int N = arrs.length; while (step < N) { int left = 0; while (left < N) { int mid = left + step - 1; if (mid >= N) break; int right = Math.min(left + 2 * step - 1, N - 1); // 修正右边界计算 Merge(arrs, left, mid, right); // 修正方法调用参数 left = right + 1; ...
异或相关面试题
异或:2进制相同为0,不同为1。同时满足交换律和结合律 0 ^ N = N N ^ N = 0 同或:2进制相同为1,不同为0 题一:如何不用额外遍历交换两个数默认情况是使用临时变量来存储一个数,最后交换。在此处我们使用异或运算,依靠异或的下列特点来进行交换。 123456789//默认情况int tmp = a;a = b;b = tmp;//依靠异或,但是条件是,A,B指向的是不同的内存区域a = a ^ b;b = a ^ b;a = a ^ b; 0 ^ N = N N ^ N = 0 题二:一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并且打印这种数(LeetCode136)默认情况是使用字典进行存储,将每种数作为键进行存储,值则为出现的次数,最后循环找到奇数次的那种数. 创建一个变量赋值为 0,使用该变量异或遍历每一个数组的值,即可。 1234567891011static void Main(string[] args){ int[] arrs = { 1, 1,2, 2, ...
并查集
并查集并查集(Union-Find)是一种用于管理不相交集合(Disjoint Sets)的数据结构,主要支持以下两种高效操作: Find(查找):查询某个元素所属的集合(通常返回该集合的代表元素)。 Union(合并):将两个集合合并为一个集合。 此外,并查集通常还支持: 初始化(MakeSet):为每个元素单独创建一个集合。 判断两个元素是否属于同一集合(isSameSet)。 核心概念 集合的代表(Root / Parent): 每个集合有一个代表元素(通常称为根节点或父节点)。 所有属于该集合的元素的 Find操作最终都会指向这个代表元素。 路径压缩(Path Compression): 在 Find操作时,将查询路径上的所有节点直接指向根节点,以优化后续查询效率。 按秩合并(Union by Rank / Size): 在 Union操作时,将较小的集合合并到较大的集合中,以保持树的平衡,提高效率。 操作 普通实现 路径压缩 + 按秩合并 Find O(n) O(α(n)) (接近常数) Union O(n) ...
复杂度,对数器,二分法
复杂度常数操作在算法分析中,”常数操作”(constant-time operation)指的是执行时间不随输入规模变化的操作,其时间复杂度为 O(1)。以下是关于复杂度和常数操作的详细说明: 常数操作的定义 特点:执行时间固定,与输入数据量无关。 示例: 基本算术运算(如 a + b、x * y)。 数组通过索引访问(如 arr[i])。 指针解引用或赋值(如 p = q)。 简单的比较(如 if (x < y))。 哈希表的插入、查找(假设哈希冲突极少)。 复杂度分析中的常数操作 大 O记号:忽略常数项和低阶项,但实际编程中常数因子可能影响性能。 例如,两个算法均为 O(n),但一个的常数操作更少,可能更快。 示例对比: 算法 A:每次循环执行 2 次常数操作 → 2n次操作 → O(n)。 算法 B:每次循环执行 5 次常数操作 → 5n次操作 → 仍为 O(n),但实际更慢。 选择,冒泡,插入都是O(n * n)的时间复杂度,其中插入排序的最好时间复杂度是O(n),最差的O(n * n)。 对数器对数器(对数器测试法)是一种用于验证算法正确性的测试方...