- 博客(48)
- 收藏
- 关注
原创 算法导论(递归回溯)——⼆叉树中的深搜
前序遍历遵循“根节点、左子树、右子树”的顺序遍历二叉树的所有节点,常用于解决子节点状态依赖于父节点状态的问题。算法思路:在前序遍历的过程中,我们可以将信息从节点向左右子树传递,并在回溯时获取左右子树的返回值。在递归结束后,根节点的返回值将更新为整棵树的数字和。
2025-04-10 18:17:00
944
原创 万字重谈C++——类和对象篇
声明和定义全部放在类体中public:// 学习的实现private:int age;// 年龄在这种方式中,所有的成员函数和成员变量都在类的定义内部。这种方式简单易懂,但编译器可能会将成员函数当成内联函数处理。类声明放在.h文件中,成员函数定义放在.cpp文件中// 在 Student.h 文件中public:private:int age;// 在 Student.cpp 文件中// 学习的实现这种方式是更常见的做法,特别是在大型项目中。它有助于代码的组织和管理。当在。
2025-04-03 17:27:54
848
1
原创 算法导论(动态规划)——子数组系列
根据状态转移方程的定义,填表顺序应为“从左往右”,即先计算前面的状态再计算当前状态。状态表表示的是以各个位置为结尾的所有子数组的最大和,但最大子数组和的具体结尾位置并不确定。
2025-04-03 17:26:42
951
原创 算法导论(动态规划)——简单多状态
在处理线性动态规划问题时,我们可以通过“经验 + 题目要求”来定义状态表示。由于状态表示涉及两个部分,我们分别分析这两个状态的转移关系:本题的初始化相对简单,无需添加辅助节点。根据状态转移方程,填表顺序为“从左往右”,同时填充两个状态表。这代表在处理到最后一个位置时的最长预约时长。
2025-03-31 21:25:11
915
1
原创 算法导论(动态规划)——路径问题
本文选择第二种形式来定义状态:设 dp[i][j] 表示到达位置 [i,j] 的路径总数。为了便于后续的状态填表,建议在状态表的前面添加一行和一列作为辅助节点。在本题中,我们可以在状态表中插入一行和一列,并将 dp[0][1] 初始化为 1,以确保后续填表过程顺利进行。最终结果即为到达位置 [m,n] 的路径数量,返回 dp[m][n] 的值即可。
2025-03-31 19:23:43
1156
2
原创 Linux入门——环境基础开发(下)
在C语言程序中,尤其是标准输入输出操作时,我们常常使用如printf这样的库函数。然而,C程序本身并未定义printf函数的具体实现。在预编译的过程中,我们只在包含的头文件中找到了该函数的声明,而没有找到其实现。printf函数的实现究竟在哪里?-E此选项用于只激活预处理过程。它会输出预处理后的代码,但不会生成汇编或目标文件。需要注意的是,预处理的结果通常要重定向到一个输出文件中,以便后续查看。示例Makemake是一个命令行工具,用于解释和执行Makefile。
2025-01-16 10:00:00
1525
2
原创 Linux入门——环境基础开发(上)
在Linux操作系统中,安装软件的方式通常较为复杂,其基本流程涉及下载程序源代码并通过编译得到可执行程序。然而,这种方法需要开发者具备一定的编程知识和环境配置能力,对于许多用户而言,操作起来显得相对繁琐。因此,为了提高用户的便利性,一些软件开发者选择了将常用软件提前编译成软件包。这些软件包可以被视作Windows系统中的安装程序,经过打包处理后,存放在服务器上,用户可以通过包管理器轻松获取并安装这些预先编译好的软件包。在这个背景下,软件包和软件包管理器之间的关系可以类比为“App”和“应用商店”。
2025-01-15 09:32:29
847
原创 Linux入门——权限
目录的权限控制了用户对该目录及其子项的访问和操作。目录权限涵盖了读取(r)、写入(w)和执行(x)三种类型。可执行权限(x)对目录而言具有特殊的含义。可执行权限(x:对于一个目录,x权限表示用户有权“进入”该目录。这反映在使用cd命令切换到目录时,这也是实现对目录进行进一步操作的前提条件。
2025-01-14 18:06:41
2162
原创 Java入门——反射枚举和Lambda
枚举是在JDK1.5以后引入的。但是常量举例有不好的地方,例如:可能碰巧有个数字1,但是他有可能误会为是RED,现在我们可以直接用枚举 来进行组织,这样一来,就拥有了类型,枚举类型。而不是普通的整形1.优点:将常量组织起来统一进行管理 场景:错误状态码,消息类型,颜色的划分,状态机等等.... 本质:是 java.lang.Enum 的子类,也就是说,自己写的枚举类,就算没有显示的继承 Enum ,但是其默认继承了 这个类。优点:1. 代码简洁,开发迅速2. 方便函数式编程。
2024-07-21 12:07:09
1095
2
原创 Java入门——Map,Set和搜索树,哈希表
以前常见的 搜索方式有:1. 直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢2. 二分查找,时间复杂度为O(log2N) ,但搜索前必须要求序列是有序的上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找比如:1. 根据姓名查询考试成绩2. 通讯录,即根据姓名查询联系方式3. 不重复集合,即需要先搜索关键字是否已经在集合中。
2024-07-19 09:00:00
661
2
原创 MySQL入门——JDBC编程
在Java JDBC编程中对数据库的操作均使用JDK自带的API统一处理,通常与特定数据库的驱动类是完全 解耦的。所以掌握Java JDBC API (位于 java.sql 包下) 即可掌握Java数据库编程。
2024-05-28 09:00:00
1165
原创 MySQL入门——索引和事务
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引, 并指定索引的类型,各类索引有各自的数据结构实现。
2024-05-27 09:00:00
512
原创 MySQL入门——增删查改(下)
需要满足:使用 GROUP BY 进行分组查 询时,SELECT 指定的字段必须是“分组依据字段”,其他字段若想出现在SELECT 中则必须包含在聚合函 数中。在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union,union all。使用UNION 和UNION ALL时,前后查询的结果集中,字段需要一致。GROUP BY 子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用 WHERE 语句,而需要用 HAVING。实际开发中往往数据来自不同的表,所以需要多表联合查询。
2024-05-26 09:00:00
2340
2
原创 MySQL入门——增删查改(上)
1. 没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序。2. AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分。2. NULL 数据排序,视为比任何值都小,升序出现在最上面,降序出现在最下面。查询同学各门成绩,依次按 数学降序,英语升序,语文升序的方式显示。1. WHERE条件可以使用表达式,但不能使用别名。1. 查询的列越多,意味着需要传输的数据量越大;4. 可以对多个字段进行排序,排序优先级随书写顺序。指定列的顺序不需要按定义表的顺序来。
2024-05-25 09:00:00
685
原创 MySQL入门——基础语法
说明:大写的表示关键字[] 是可选项CHARACTER SET: 指定数据库采用的字符集COLLATE: 指定数据库字符集的校验规则说明:当我们创建数据库没有指定字符集和校验规则时,说明:MySQL的utf8编码不是真正的utf8,没有包含某些复杂的中文字符。MySQL真正的utf8是 使用utf8mb4,建议大家都使用utf8mb4。
2024-05-24 17:25:37
382
原创 Java入门——异常
其中 Error 指的是 Java 运行时内部错误和资源耗尽错误. 应用程序不抛出此类异常. 这种内部错误一旦出现, 除了告知用户并使程序终止之外, 再无能无力. 这种情况很少出现.我们发现, 一旦 try 中出现异常, 那么 try 代码块中的程序就不会继续执行, 而是交给 catch 中的代码来执行. catch 执 行完毕会继续往下执行.一段代码可能会抛出多种不同的异常, 不同的异常有不同的处理方式. 因此可以搭配多个 catch 代码块.Java 内置了丰富的异常体系, 用来表示不同情况下的异常.
2024-05-16 10:00:00
941
2
原创 Java入门——String类
常见的构造 String 的方式PS"hello" 这样的字符串字面值常量, 类型也是 String.String 也是引用类型. String str = "Hello";这样的代码内存布局如下由于 String 是引用类型, 因此对于以下代码内存布局如图那么有同学可能会说, 是不是修改 str1 , str2 也会随之变化呢?我们发现, "修改" str1 之后, str2 也没发生变化, 还是 hello?
2024-05-15 10:00:00
993
2
原创 Java入门——继承和多态(下)
抽象类和接口都是 Java 中多态的常见使用方式. 都需要重点掌握. 同时又要认清两者的区别核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不 能包含普通方法, 子类必须重写所有的抽象方法.
2024-05-14 10:00:00
1081
1
原创 Java入门——继承和多态(中)
多态是面向对象程序设计中比较难理解的部分. 我们会在后面的抽象类和接口中进一步体会多态的使用. 重点是多态带 来的编码上的好处.另一方面, 如果抛开 Java, 多态其实是一个更广泛的概念, 和 "继承" 这样的语法并没有必然的联系.C++ 中的 "动态多态" 和 Java 的多态类似. 但是 C++ 还有一种 "静态多态"(模板), 就和继承体系没有关系了.Python 中的多态体现的是 "鸭子类型", 也和继承体系没有关系.Go 语言中没有 "继承" 这样的概念, 同样也能表示多态.
2024-05-13 10:00:00
1197
原创 Java入门——继承和多态(上)
包是组织类的一种方式. 使用包的主要目的是保证类的唯一性.例如, 你在代码中写了一个 Test 类. 然后你的舍友也可能写一个 Test 类. 如果出现两个同名的类, 就会冲突, 导致 代码不能编译通过.
2024-05-12 10:00:00
1006
原创 Java入门——类和对象(上)
/实例变量 存放在对象内//实例变量//实例变量//类变量也叫静态变量,编译时已经产生,属于类本身,且只有一份。存放在方法区//被final修饰的叫常量,也属于对象。被final修饰,后续不可更改//静态的常量,属于类本身,只有一份 被final修饰,后续不可更改//实例成员函数 public void eat() {int a = 10;//局部变量");} //实例成员函数");} //静态成员函数//不能访问非静态成员error//产生对象 实例化对象。
2024-05-10 20:23:15
1377
1
原创 C++入门 ——类和对象(二)
我们先来定义一个日期类 Date对于上述类,有这样的一个问题:Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函 数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏 的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量” 的操作,都是通过该指针去访问。
2024-05-05 17:40:07
738
原创 C++入门——类与对象(一)
/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。类的两种定义方式:1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内 联函数处理。
2024-05-01 13:40:32
631
原创 C++入门——基本概念与关键字(下)
在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的 是一直没有人去使用它,大家可思考下为什么?auto不再是一个存储类型指示符,而是作为一 个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。return 10;auto b = a;//auto e;无法通过编译,使用auto定义变量时必须对其进行初始化return 0;【注意】
2024-05-01 10:03:30
1141
原创 C++入门——基本概念与关键字(中)
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重 载了。比如:以前有一个笑话,中国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个 是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!
2024-04-30 11:47:08
854
原创 C++入门——基本概念与关键字(上)
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。// 1. 正常的命名空间定义// 命名空间中可以定义变量/函数/类型int val;//2. 命名空间可以嵌套int a;int b;int c;int d;//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。// ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个// test.h。
2024-04-30 10:56:53
1214
原创 再谈C语言——理解指针(五)(完结篇)
这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,⽽且 是数组⾸元素的地址,我们来做个测试。输出结果:我们发现数组名和数组⾸元素的地址打印出的结果⼀模⼀样,数组名就是数组⾸元素(第⼀个元素)的地 址。这时候有同学会有疑问?数组名如果是数组⾸元素的地址,那下⾯的代码怎么理解呢?输出的结果是:40,如果arr是数组⾸元素的地址,那输出应该的应该是4/8才对。
2024-04-25 11:34:13
1329
1
原创 数据结构入门——排序(代码实现)(下)
交换左右两侧找到的不符合条件的元素,使得左侧元素小于基准元素,右侧元素大于基准元素。:否则,如果左边界元素大于右边界元素,说明中间元素为最大值,返回左边界索引。:否则,如果左边界元素小于右边界元素,说明中间元素为最小值,返回左边界索引。循环,循环条件是左边界索引小于右边界索引,表示还有未比较的元素。:交换基准元素和左指针所指的元素,将基准元素放置到正确的位置。:且中间元素小于右边界元素,则中间元素为中间值,返回中间索引。:且中间元素大于右边界元素,则中间元素为中间值,返回中间索引。
2024-04-25 11:00:00
1205
1
原创 数据结构入门——排序(代码实现)(上)
用于标记在当前轮冒泡排序中是否发生过元素交换,若没有发生交换则表示数组已经有序,可以提前结束排序。:建立初始堆,从最后一个非叶子节点开始,向上逐个调整节点,保证每个节点都满足堆的性质。:外层循环,控制需要进行多少轮冒泡排序,每轮将一个最大的元素移动到正确的位置。:如果较小的孩子比父节点大,则交换父节点和孩子节点的值,并继续向下调整。比当前位置的元素小,则将当前位置的元素后移一个间隔。:如果前一个元素大于后一个元素,则交换它们的位置。比当前位置的元素小,则将当前位置的元素后移一位。接受一个整型数组指针。
2024-04-25 10:30:00
1158
1
原创 再谈C语言——理解指针(四)
assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终⽌运⾏。这个宏常常被称为“断⾔”。上⾯代码在程序运⾏到这⼀⾏语句时,验证变量 p 是否等于 NULL。如果确实不等于 NULL ,程序 继续运⾏,否则就会终⽌运⾏,并且给出报错信息提⽰。assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值⾮零), assert() 不会产⽣ 任何作⽤,程序继续运⾏。
2024-04-24 19:23:34
2296
1
原创 再谈C语言——理解指针(二)
指针变量的⼤⼩和类型⽆关,只要是指针变量,在同⼀个平台下,⼤⼩都是⼀样的,为什么还要有各种各样的指针类型呢?其实指针类型是有特殊意义的,我们接下来继续学习。
2024-04-23 10:47:23
957
1
原创 再谈C语言——理解指针(一)
在讲内存和地址之前,我们想有个⽣活中的案例: 假设有⼀栋宿舍楼,把你放在楼⾥,楼上有100个房间,但是房间没有编号,你的⼀个朋友来找你玩, 如果想找到你,就得挨个房⼦去找,这样效率很低,但是我们如果根据楼层和楼层的房间的情况,给每个房间编上号,如:⼀楼:101,102,103...⼆楼:201,202,203.......有了房间号,如果你的朋友得到房间号,就可以快速的找房间,找到你。⽣活中,每个房间有了,就能提⾼效率,能快速的找到房间。如果把上⾯的例⼦对照到计算中,⼜是怎么样呢?
2024-04-10 17:39:45
1022
3
原创 再谈C语言——指针篇
数组指针是指针?还是数组?答案是:指针。我们已经熟悉:整形指针: int * pint;能够指向整形数据的指针。浮点型指针: float * pf;能够指向浮点型数据的指针。那数组指针应该是:能够指向数组的指针。
2024-03-27 20:53:42
878
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人