- 博客(31)
- 收藏
- 关注
原创 日撸Java三百行(day35:图的m着色问题)
对于图的m着色问题,我们使用的是枚举法,也是一种暴力解题法。对于人来说,枚举法似乎看起来是一种“笨方法”,因为它没有特别高的技术含量而且还很繁琐,但是对于计算机而言则不然,暴力解题法的逻辑相对简单直接,利用计算机比较容易实现,而且当规模不是很多的时候,暴力解题法可能比复杂的优化算法更为高效。总之,学习计算机万能的暴力解题法是必不可少的。
2024-08-27 00:01:04
1089
原创 日撸Java三百行(day32:图的连通性检测)
图是一种比树复杂的非线性数据结构,我们先来了解一下图的相关基本概念。图是由顶点集合和顶点之间的边集合组成,通常表示为G(V,E),其中G表示图,V是G中顶点的集合,E是G中边的集合。根据图中边的方向,图可以分为无向图和有向图;而根据边长是否有权重,图又可以分为带权图和不带权图 完整的程序代码运行结果
2024-08-23 18:32:46
996
原创 日撸Java三百行(day31:整数矩阵及其运算)
从今天开始,我们就要踏上图论的学习之路了。第一天,我们先简单热个身,构造一个整数矩阵。总的来说,今天的内容以及代码难度还是比较简单的,毕竟我们之前已经学过矩阵的一些运算了,所以今天的整数矩阵可以算是一个回顾;不过同时,今天也是一个铺垫,因为明天我们就会学习图的连通性,会涉及到邻接矩阵、连通矩阵,这就需要以今天的内容为基础进行延伸。
2024-08-22 23:20:20
1281
原创 日撸Java三百行(day26:栈实现二叉树深度遍历之前后序遍历)
今天的主要内容就是利用栈迭代实现二叉树的前序遍历和后序遍历,其实就是昨日内容的一个延续。由于有了昨天分析准备和相关代码的基础,今天进行起来就没有那么困难了,夸张一点说,经过这两天栈实现二叉树遍历的运用,我感觉我的迭代思维得到了升华…除了递归与迭代的转换,今天我们还介绍了一种非常重要也非常好用的思想——等价替换,即将一个复杂又难以解决的问题,替换为一个等价且比较容易解决的问题。在高中阶段学习数学时,我的数学老师就特别喜欢用等价替换,每次都能把一个巨难的数学题转换成一个简单的基础题;
2024-08-17 23:55:10
1532
原创 日撸Java三百行(day25:栈实现二叉树深度遍历之中序遍历)
今天,我们主要学习的就是如何利用栈来实现二叉树的中序遍历,其本质上就是递归思维和迭代思维的相互转化。单看今天的代码量的话,其实挺少的,但是如果想要说清楚理透彻这两种思维的转化过程,似乎就比较困难了,本文也只是作者个人一些浅薄的理解,如有误,欢迎批评指正。通过今天的学习,我们可以发现果然还是递归用起来简单,不过我们还是需要像二叉树遍历这种较为复杂的迭代操作,这对于锻炼一个程序员的迭代思维还是非常好的。
2024-08-16 23:03:51
1682
原创 日撸Java三百行(day24:二叉树的建立)
总的来说,今天的代码还是比较简单的,只在之前代码的基础上增加了一个构造方法和相应的数据测试。在具体实施过程中,我觉得最难的就是分清楚下标顺序表的真实索引值和下标顺序表中存放的值(下标顺序表中存放的值,即为结点按照完全二叉树模式进行的编号下标)。通过今天的学习,我们其实可以发现,不同数据结构之间可以进行灵活的转换,而现实世界中的各种逻辑结构又总是非常复杂,所以当以后我们想要用数据结构去灵活地表示某种复杂的逻辑时,就可以考虑进行可逆的转换。
2024-08-15 22:50:55
1286
原创 日撸Java三百行(day23:使用具有通用性的队列)
在昨天,我们使用了两个队列来辅助完成二叉树的“压缩顺序存储”,一个是存放二叉树结点类型的数据队列,另一个是存放整数类型的下标队列,这样来看,对于不同的数据类型,难道我们都要单独编写一个队列吗?答案显然不是,事实上,我们只需要一个存储对象的队列就可以完成了,今天我们就来学习一下“通用性队列今天的代码量并不多,就是通过使用通用性队列将昨天的代码进行简化,提高代码的复用性。面对不同的数据类型,我们可以使用通用性队列进行处理,那么二叉树呢?
2024-08-14 20:18:52
1252
原创 日撸Java三百行(day22:二叉树的存储)
关于二叉树的存储,昨天我们提到有顺序存储和链式存储这两种方式,不过非完全二叉树顺序存储的话会造成很大的空间浪费,所以我们昨天使用的是链式存储结构。但是,对于二叉树的存储而言,引用(指针)是没办法存储到文件里的,也就没办法成功还原二叉树;此外,众所周知顺序表的查找是非常高效的,所以今天我们再次考虑二叉树的顺序存储。
2024-08-13 20:53:19
1129
原创 日撸Java三百行(day21:二叉树的深度遍历的递归实现)
和线性表一样,树也可以用于存放数据元素,不过不同的是,树是一种非线性的数据结构,是由n(n ≥ 0)个有限结点组成的一个具有层次关系的集合,
2024-08-12 23:16:33
1084
原创 日撸Java三百行(day20:小结)
今天已经是学习的第20天了,为了更透彻地理解前20天的内容以及便于顺利地进入下一阶段,我们进行一个小结,通过以下6个问题来回顾一下之前的内容。
2024-08-11 23:17:48
826
原创 日撸Java三百行(day19:字符串匹配)
目录一、字符串的一些基础知识二、代码实现1.字符类的创建2.字符类的遍历3.字符串匹配4.字符串截取5.数据测试6.完整的程序代码总结字符串(String)是用一对双引号括起来的零个或多个字符组成的有限序列,在java中,字符串是被作为对象来处理的。常用的字符串可以分为以下两大类:毫无疑问,字符串是计算机处理信息的基础,毕竟我们向计算机输入的信息本质上都是字符串,而计算机所谓的“打印”实际上也是以字符串的形式显示出来的。所以,要想学好计算机,学会并熟练使用字符串以及字符串的各种操作(比如拼接、比较、截取、查
2024-08-10 23:49:48
1070
原创 日撸Java三百行(day18:循环队列)
目录一、顺序队列与循环队列二、代码实现1.循环队列创建2.循环队列遍历3.循环队列入队4.循环队列出队5.数据测试6.完整的程序代码总结在昨天,我们提到队列实现除了采用链式存储结构,还可以采用顺序存储结构(因为队列是线性表,所以和线性表一样也有顺序、链式两种存储结构)。采用顺序存储结构的队列叫做顺序队列,它是用一组地址连续的存储单元依次存放从队头到队尾的队列元素,其中,需要附设头指针head和尾指针tail,分别指向队头元素和队尾元素。为方便理解,下面我们用图示进行相关说明(假设队列的总存储空间TOTAL_
2024-08-09 23:52:18
1670
原创 日撸Java三百行(day17:链队列)
队列是一个非常基本非常重要的数据结构,因其先进先出的特性,使得它在管理和调度顺序性任务时非常有效,在很多实际问题中,合理利用队列可以提升效率、保证数据处理的顺序性和稳定性;同时,队列还可以用来实现很多算法,比如广度优先搜索算法、消息传递等等。队列和我们之前学过的栈都是常用的两种数据结构,也均为受限线性表,只不过前者为先进先出,适用于按顺序处理的场景,后者为先进后出,适合需要逆序处理的场景。
2024-08-08 23:43:15
1434
原创 日撸Java三百行(day16:递归)
递归是一种强大且常用的编程技巧,在java中经常被使用,它可以将复杂的问题分解为更小规模的子问题,简化代码逻辑;同时能够直观地表达问题的解决思路,提高代码的可读性;而且在某些算法中还能实现更高效的解决方法。不过,递归也存在一些不足,因为递归的函数调用本质上是栈的使用过程,所以如果递归中没有明确的结束条件,那么就非常容易导致用栈过深,造成栈溢出错误,同时递归调用需要创建多个栈帧,对系统资源有一定的消耗。
2024-08-07 18:17:11
1207
原创 日撸Java三百行(day15:栈的应用之括号匹配)
总体来说,今天学习的内容不是很复杂,简单来说就是对昨天栈的入栈出栈等操作进行一个应用,而且根据今天代码的难度,其实可以知道括号匹配算是栈的一个基本应用,不过它也是一个非常重要的应用,在今后很多算法和问题中都会涉及到。
2024-08-06 22:38:34
1594
原创 日撸Java三百行(day14:栈)
总的来说,今天的代码还是比较容易的,一方面是因为有了前两天顺序表和链表的基础,另一方面是因为栈的操作本身就不复杂,而且入栈出栈的时间复杂度均为O(1),所以利用栈来存取数据是比较迅速的。不过,栈虽然操作不复杂,但是它在计算机领域却有着举足轻重的作用,栈不仅是一种高效的内存结构,还贡献于计算机底层技术(例如函数调用、中断处理、程序调试等)。
2024-08-05 20:55:03
1250
原创 日撸Java三百行(day13:链表)
昨天我们讨论了顺序表,由于其底层是一段连续的物理空间,所以当想要在顺序表中的任意位置插入或删除元素时,必须通过大段元素整体后移或前移才能完成,所以效率很低,时间复杂度为O(n),针对这一问题,java引入了链表结构。链表有一个非常好的性质就是在插入、删除元素时不用移动元素,只改变引用即可,所以效率比较高。但是链表也有不足的地方,就是当需要定位查找元素时,链表只能按链接顺序依次访问数据元素,时间复杂度为O(n)。
2024-08-04 23:12:52
1784
原创 日撸Java三百行(day12:顺序表二)
今天我们主要通过顺序表查找、插入、删除这三个操作来深入理解和学习顺序表,可以发现顺序表的查找操作较迅速,其时间复杂度为O(1),这也是顺序表的优势所在。但是顺序表的缺点也是显而易见的,由于顺序表是顺序存储结构,要求其内的元素在存储时必须紧密相连,不能出现“空白”,所以这就造成了顺序表不能随意、直接地进行插入和删除,必须通过一大段元素移动覆盖的方式间接完成,因此其时间复杂度就为O(n)。
2024-08-03 21:20:59
943
原创 日撸Java三百行(day11:顺序表一)
public class 类名 {成员变量 //代表属性,一般是名词成员方法 //代表行为,一般是动词...//属性(成员变量)//行为(成员方法)System.out.println("用手机打电话");System.out.println("用手机打游戏");;这里我们使用了final关键字,目的是为了保证顺序表的最大长度在后续操作中不会被更改。
2024-08-02 23:54:32
1187
原创 日撸Java三百行(day10:综合任务1)
今天通过解决一个综合任务,回顾了if语句、for语句、break语句、continue语句等,同时也学习了生成随机数的方法。今天求成绩最好、最差的处理方式,是将tempBestScore令为可取得的最小值,将tempWorstScore令为可取得的最大值,但是貌似我们也可以直接将总成绩数组中的第一个值令为初始值,再从总成绩数组中的第二个值开始遍历比较,这样好像也可以实现。总之,还是那句话,对于实际的问题,一定要学会拆分问题,分步骤进行代码实现。
2024-08-01 23:26:33
1273
原创 日撸Java三百行(day09:while语句)
到今天为止,java的基础知识已经差不多结束了,主要包括一些关键字、分支语句(if、switch),循环语句(for、while)、数组等,明天通过一个综合任务来给java基础语法画上句号。其实while语句在本质上是比for语句更基础的,但在实际操作中,我们会更倾向于使用for语句,而while语句的使用率就明显比较低。在今天完整的代码中,我们还可以知道,while语句中除了利用条件判断语句来控制循环的进行,还可以使用无限循环+break语句。
2024-07-31 22:28:45
1203
原创 日撸Java三百行(day08:矩阵相乘)
昨天学习了java中的矩阵相加,今天学习了java中的矩阵相乘,这两天的学习中,可能因为上学期刚学完线代,所以对于相关数学基础比较得心应手,但等到了代码实现环节就显得不够熟练了,其实,这主要是源于利用代码模拟数学问题的能力不够,不知道怎么才能将数学问题与程序代码联系起来,所以我们要学会将遇到的问题进行拆分化解,一步一步与代码关联,再一环扣一环,实现模拟。
2024-07-30 23:20:38
1599
原创 日撸Java三百行(day07:矩阵元素相加)
数据类型 数组名[];事实上,上述定义数组的格式只是为方便C、C++程序员更快适应java语言,但在java的实际操作中并不推荐使用,因为该定义方式容易产生数组类型就是int型的误解。数据类型[] 数组名;int:表示数组中的元素类型为int型int[]:表示数组类型为int型矩阵是非常重要的数据结构,同时其在图像处理、机器学习等方面也有广泛应用。学习矩阵,需要我们在理解矩阵的相关数学逻辑的基础上,有扎实的java基本知识以及编程思想。
2024-07-29 23:48:51
854
原创 日撸Java三百行(day06:基本for语句)
(1)面对大量、重复的代码,循环语句可以帮助我们更简洁地实现需要重复执行的操作,并且循环语句也是程序的核心,算法的时间复杂度一般根据循环语句来计算。(2)而在java的三种循环结构中,for循环是使用最广泛的,它比while循环、do-while循环多了初始化部分和迭代更新部分,其结构更为简洁,能够在一行内完成循环控制的全部部分。(3)增强for循环主要用于遍历数组或集合,其优点是简洁直观、易读性强,可以避免索引操作,但不能用来修改数组或集合中的元素。
2024-07-28 22:36:43
834
原创 日撸Java三百行(day05:基本switch语句)
1.if语句适用于对条件进行灵活的判断和处理,可以处理复杂的逻辑条件,也可以同时处理多个条件;可以处理取等判断,也可以处理区间判断。2.switch语句适用于处理大量的离散条件,特别是单一变量的不同取值问题;只能处理取等判断。3.选择使用if语句还是switch语句,需要根据实际情况具体分析。
2024-07-27 23:47:50
3245
2
原创 日撸Java三百行(day04:闰年的计算)
***/} else {} // of if/***/= 0) {} else {} // of if1.不管学习哪种语言,闰年的判断都是一个非常经典的问题,可以很好的反映程序语言的逻辑性。2.在复杂的if语句嵌套中,一定要注意if与else的配对情况,else总是与其前面距离最近且未配对的if进行配对,即满足就近原则。3.布尔类型boolean的取值只有true和false,不能用1和0代替。
2024-07-26 23:27:08
1384
原创 日撸Java三百行(day03:基本if语句)
把一些代码或代码块打包在一起,这个过程就叫方法定义。//方法名采用的是小驼峰命名法。public static void 方法名() {方法体;public static void 方法名(参数) {… …}public static void 方法名(参数1,参数2,……) {… …}public static 返回值类型 方法名(参数) {方法体;return 返回值;
2024-07-25 23:26:02
1466
原创 日撸Java三百行(day02:基本算术操作)
1.变量命名时尽量做到见名知意,例如:在上文的代码中,tempFirstInt就很容易知道是代表第一个整型数据,而tempSecondDouble则代表第二个实型数据。2.为了增强代码的可读性,代码区域明确分为数据声明、数据初始化、数据操作三个部分,同时每个部分用空行隔开,并对每个功能段进行简要的注释说明。3.为了增强代码的可读性,运算符与运算符之间、运算符与变量之间用空格隔开。
2024-07-24 22:34:12
893
原创 日撸Java三百行(day01:环境搭建)
本人为人工智能专业学生,大一期间学习过C、C++的相关内容,希望跟着闵帆老师继续学习Java语言以及数据结构、机器学习等方面的知识,同时培养规范的代码习惯。java中的命名规则project命名:全部小写package命名:全部小写class命名:大驼峰命名法,每个单词首字母大写,其余字母小写,例如:HelloWorld方法命名:小驼峰命名法,第1个单词全小写,后面单词首字母大写,例如:sendMessage。
2024-07-23 19:45:27
1132
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅