自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(89)
  • 收藏
  • 关注

原创 力扣第206题-反转链表

【代码】力扣第206题-反转链表。

2024-05-20 11:45:23 196

原创 力扣第141题和142题-环形链表,是否有环,环的入口节点

【代码】力扣第141题和142题-环形链表,是否有环,环的入口节点。

2024-05-19 17:10:22 134

原创 力扣77题-组合

【代码】力扣77题-组合。

2024-05-14 11:35:32 96

原创 回溯算法-组合问题-力扣第77题

举例:有一个集合:{1,2,3,4}现在要找出这个集合里面所有组合大小(组合长度,组合里面数据的个数)为2的组合那么就有:总共6种组合{3,4}注意:组合问题是无序的,即{1,2}={2,1},只算一种排序问题是有序的,{1,2}和{2,1}是算两种。

2024-05-14 10:37:06 903

原创 面试题:调整数字顺序,使奇数位于偶数前面

(这个奇偶数的原顺序不变)

2024-05-13 21:18:59 190

原创 贪心算法应用例题

相邻距离近的先发生碰撞。输出为空,全爆炸完了。

2024-05-07 20:23:20 584

原创 数据库MySQL的基本操作

在Linux里面,我们要对数据库MySQL进行操作时(例如修改MySQL的密码),不是直接在我们的终端上进行操作,而是通过终端连接进入到MySQL里面去,在进行操作,写SQL语句。而安装C++等的开发库sudo命令,是在终端上进行。

2024-05-04 20:06:27 337

原创 图书馆管理系统(4)

而数据的所有操作函数等,都是在内存中的数组(astBook)里进行操作,因为文件IO里面的操作特别慢。学生管理,成绩管理,餐饮管理,订票服务管理,银行存取钱财管理,通讯录号码管理。在我们还没想出更多的模块功能时,还可以预留接口,后面想到了再加模块。就要写两个版本的保存函数,一个是动文件指针位置(光标)的fseek。修改成功,但返回后再重新显示的信息并未修改,这是因为——没有保存。当代码出错调试时,哪个地方出错,就把断点下到哪个函数那儿。所以每一个函数里面,都有打开文件,读到内存的操作。

2024-04-30 12:13:26 268

原创 图书馆管理系统(3)

这三个的scanf输入加不加取地址符&都是可以的,上面代码框里的没加&,但还是加上比较好。我们定义了图书长度为200,即最多只能输入200个,200种编号的图书(图中黑色的)这里写一个图书馆管理系统,也相当于写了多个类似的系统,通讯录管理系统,餐饮管理系统。现在删完后1002号信息已经不存在了,那么被删除覆盖掉的,1002号怎么表示。假设找到了,要删除的图书编号为1005的位置在图中绿色框部分。那么现在要怎么删除——穿透删除,将后面的数据依次往前移动。————因为数组名本来就表示地址的意思了。

2024-04-12 00:04:31 295

原创 SQL Server(3)

创建表 S(供应商),P(供应零件),J(供应工程),SPJ(3表连接)插入数据。

2024-03-31 22:14:34 302

原创 SQL Server(2)

查询CS(computer science 计算机科学)专业的学生,以及年龄不大于19岁的学生。查询既选修了课程号为1,又选修了课程号为2的学生的学号——该学生要同时选修了1和2。查询计算机科学专业的学生,与年龄不大于19岁学生的差集。即选了CS专业的学生里面的,但是年龄大于19岁的学生,查询选修了课程号为1,或者课程号为2 的学生的学号。即符合前一个集合,但是后一个集合的相反的集合,的交集。查询计算机科学专业与年龄不大于19岁的学生的交集。将选修2课程的所有学生(多个元组)的成绩减少5分。

2024-03-31 19:53:09 221

原创 SQL Server

往Route表中插入数据。

2024-03-31 16:23:02 190

原创 文件操作3

可以看到上图第一遍fread的返回值len1为15,不是100,因为fread的返回值是实际读取的数据数量。所以在第二次读len2之前,我们要将文件标记位置,重新移动到文件开头——fseek。这里的文件读写位置标记——可以想象成图形界面里的光标,读写时自动移动。而读数据时,也有一个看不见光标,随着已经读完的数据,往后移动。例如读下图中的一串数据,第一遍顺序读到末尾,光标显示在末尾。例如要到达文件开头,那就是偏移量为0,以文件开头为参照点。要是以第一遍读完后的文件尾,为当前位置,作参照点,

2024-03-25 23:03:57 455

原创 文件操作2

可以看到代码执行完后2个文件的大小是一模一样的,打开第二个文件,里面复制的内容也跟第一个一样。但这两个函数不太好用也不广泛,因为它们只能读写文本文件,非文本文件的操作可能会出错,且速度慢。这里相对路径创建的文件就跟下图中右上角的——打开所在的文件夹,打开后的路径一样。后面相对路径创建的文件就在下图中,即上图中刚刚打开的所在文件夹。打开1.txt文件,因为是二进制的形式,所以是这样看不懂的乱码。因为是中间不做任何转换的二进制,如果有转换,字节大小就不一样了。二进制文件打开,我们看到的是乱码,

2024-03-25 18:08:38 355

原创 文件操作1

可以看到这个buf打印出来有问题这里一路烫是因为我们前面说过的,在文件中,字符串的结尾并没有‘\0’而buf是一个字符串数组,所以一个简单的办法就是把它写成——

2024-03-20 23:10:40 858

原创 文件概念-C语言

例如下图,这个要往屏幕上写数字1,但它的输出是个小黑块或像个口字或是别的奇怪的字符,也可能什么都没有,看不见,不同的系统表现可能略有不同,但根本上数字1就是一个看不见的字符,非要看的话就是个奇怪的符号,但它没有任何意义。还有一种就是打开一本书,你能看见也能复制它的文字,但它不是文本,是照片拍出来的图片识别后的,所以它的文字就不清晰较模糊。文本文件的文字都是非常清晰的。我们可以先将上面的1转成16进制,为31,再转成10进制,3*16+1=49,而阿斯克码49就是字符1的编码,字符0的编码为48。

2024-03-19 08:54:57 902

原创 图书馆管理系统(2)

接下来实现系统的子菜单,在写一个子模块的时候,其他子模块先屏蔽起来,因为没实现,代码运行就通不过。如果要在这个子菜单里面加一个跟主菜单一样的,按错数字3秒后仍返回这个子菜单。之所以要用结构体来封装打包图书信息,是因为如果现在把编号为1号图书删除。接下来写下图的子系统,下面要增删改查的这些信息,就是刚才已经封装过了的。接下来要定义2个全局结构体数组,用来记录所有的图书信息和读者信息。第一步,先要把图书的所有信息封装一下,用结构体封装。那么同理,也把图书的所有信息封装一下,用结构体封装。

2024-03-07 23:02:17 369

原创 图书馆管理系统(1)

前面说过不能所有的东西都写到主函数里面(主函数里面调用就可以了),所以首界面就写一个界面显示函数,用函数封装——ShowMainMeun()因为用户输入0时,while(0)为假(其他数字均为真,均在while里面循环),就自动退出while循环了,也就是退出图书馆管理系统了。其中大一点的模块相当于主菜单,小一点的模块相当于子菜单,那就有了主菜单和子菜单如何响应(主到子,子回主)的问题。之前我们学的都是,代码从主函数进入,执行完,自动从主函数出来,程序就退出了。所以要在下面接着写,让它回到主菜单界面里面。

2024-03-05 18:17:45 388

原创 BF算法(2)

不直接把strlen计算写到循环里是因为这样就不用每一次进入循环都要计算一遍了。上面的if判断里面写了strlen是因为那里没有定义循环,if里也只计算一遍。下面来看看BF算法的时间复杂度:O(n*m)(主串长度乘子串长度)接下来定义主串下标i和子串下标j,开始比较是否相等并判断比较条件。判断条件里要求str和sub的长度,在前面加上计算长度,一进入函数先参数判断,考虑每个参数成员一遍。循环内是相等继续和不相等回退2种情况,全部遍历完后,出循环要判断是否查找成功。先定义2个串,主串和子串。

2024-03-05 08:26:29 366

原创 串的定义及BF算法

用来搜索关键字,而Search函数只是用来搜索一个字符,比如下面push关键字的开头p,但search搜索不了整个关键字push。因为如果i不回退,那就只找了主串中以第一个字符开头的子串,第二个到第n个字符开头的子串都没找,漏掉了怎么能说没找到。其应用特别多,比如经常在一篇文章里面搜索一些东西,(比如文章里的某个内容,或某些关键字词出现的位置,次数等)主串的下标i,和子串的下标j,然后将i位置的字符和j位置的字符进行对比,2个都一样就一块往后走,比下一个。每次不匹配时,i回退到上次开始的位置的下一个;

2024-03-04 22:57:25 361

原创 静态链表(3)

综上所述,静态链表就是处理两条链表,静态链表总的执行一次插入或删除,就是分开的2条各执行一次插入或删除,而分开的链表里面执行的插入或删除操作步骤跟前面的链表是一模一样的。因为该静态链表只有8个数据域可以放数据,所以如果在头插之后接着尾插,它并没有地方放数据了,所以输出的还跟之前的头插一样。综上所述,尾插就是,获取——剔除——放数据——找尾巴——插入。例如,静态链总插入,则有效链插入,空闲链删除;静态链总删除,则有效链删除,空闲链插入;尾插就比头插多了一步找尾巴,其他均一样。所以将头插注释掉换成尾插。

2024-03-04 08:01:33 293

原创 静态链表(2)

刚开始数组的格子里面都是随机值,而头结点(有效和空闲)或是其他结点的next域里面要是随机值就出问题了,你连接的下一个节点是个随机值,不知道它在哪或是有无。有效头结点0的next——应该置成0(静态链表模拟的是循环链表),因为刚开始初始化,即没有一个有效数据结点,所有结点都为有效数据就是满,反之空闲结点都没了,即ps[1].next==1;我们已知链表的头结点的数据域是不用的,所以这里的2个头结点的数据域也不用。依次往下,最后一个空闲结点的next为1,回到头结点。空闲头结点1的next——应该置成2。

2024-02-28 23:44:18 313

原创 静态链表(1)

如果已知有一个空闲结点的情况下是遍历一次(所以有的说On),但若是有5000个结点,且不知道里面一共有几个空闲结点时,且第几个为空闲结点时,那就每个结点都需要遍历一遍看看在不在里面了。而在静态链表里面,要想插入,只要找到空闲结点O(n^2),将要插入的有效数据val赋值覆掉原来的无效数据O1,盖然后把它接入(先绑后,再接前)到有效数据链里面O1,就完成了。(a)图中0的next是1,1的next是2,……之前说过数组中的数据域都是有数字的,只不过有些数字有效,有些数字无效,无效的数字在数组中就当做不存在。

2024-02-28 17:07:53 366

原创 双向链表(2)

但在双向链表里面,前驱已经用prio保存了(在找到Search的结点里面的prio),所以不用调用函数了。p->prio则不可能为空,因为它最多可能在下图中的位置,prio也是plist的位置100。虽然第二条链没断,但在free(p)之后,整个结点p都没了,此时第二条链自然就断了。将第一行中的300(p->prio->next)改成200(p->next),销毁函数跟前面链表的销毁是一模一样的,也是只穿透删除第一条线,没有写第二条线。同理,写多级指针时,必须要判断一下是否为空(有空则会崩溃),

2024-02-28 13:25:18 359

原创 双向链表(1)

DList指向整个表,DNode指向头结点,头结点后面串起了整个表,所以虽然两个的含义不同,但在计算机里面的用法是等价的,都是代表整个表。代码崩溃的主要原因之一就有——访问了空的指针,特别是在什么的什么的什么,这样的多级指针时,其中某一级指针为空时,整句代码都将崩溃。1.p的next置为500,p的NULL变为500——p->next = plist->next;p的next的prio中的100变为800——p->next->prio = p;(p不为空,则访问p的next或是访问p的prio都没错)

2024-02-26 19:42:04 353

原创 循环链表4

malloc的原本用法就是malloc前面有一个void*的指针,因为malloc申请出来的结点需要一个指针去指向它,才能让这个新结点被找到,但这个指针没有返回值,没有名字,所以在后面sizeof里面写完你要定义的结点类型后,前面对应的就要强转类型了。所以只要有Node*(除了强转类型)就是定义指针,只是看它有没有接收结点,接收了结点的话后面写它就是代指其接收的结点,也就是p表示一个结点,p和p的next的实际值就是那一长串数字地址,将数字地址赋值也就是改变指针指向,而地址必须要存起来,否则链条就会断掉。

2024-02-26 05:22:34 843

原创 不定长顺序表4

所以,如果我们的程序是一运行完成就结束释放的,那么可以不调用销毁函数。前面初始化已经开了一个内存空间来放这个顺序表,那么这个顺序表使用完后不需要这个表了,就要把前面开出来的内存空间销毁了。malloc在实现里,free在调用里。像我们前面一堆的函数测试里面,我们发现程序运行输出完之后并没有内存泄漏崩溃,那是因为这里程序已经结束,进程已经退出了,那么系统就会自动释放刚刚运行的内存。那么不退出,就意味着不会释放内存,那此时有内存不停泄漏的话,就会不断消耗内存,内存越来越小,程序运行就越来越慢了。

2024-01-19 09:00:14 409

原创 14——3

同理,当对Ai的要求减少时,可以取个极端的例子,1个o就可以置换出1个x,那Bi就很大了,那V就是100%了。我们已经知道它会有2个答案解的,min和max。这里的V是我们假定出来的答案,我们要做的就是试一试这个V符不符合题目要求。在这半段对Ai的要求增加时,在o总数不变的情况下,产出x是变少降低的。在实在不会的情况下,可以将投入值和产出值分别输入上下取整的式子中。二分查找法不一定是要去找,它是有单调性的,只要这半边符合它的性质。而这个相同的数字有多个,在这里面找到头和尾,最大值和最小值。

2024-01-19 08:52:38 339

原创 Linux文件查看命令

比如一个系统上线运行一年多了,现在根据问题要看它的日志,那么很少会说先去看一年前的运行的日志文件,那对于现在的问题来说参考价值的可能性不大,但也会有需要1年前的日志文件的情况,就是这种情况很少。例如你有一个日记本,那你会经常翻看10年前写的东西(head),还是最近新写的东西(tail),一般来说,最近新记录的东西要比10年前记录的东西对于最近发生的事情要更有参考意义价值。现在将原来不知道放了什么东西的test.c文件删掉,再建一个新的test.c文件,现在test.c文件就是空的,里面什么都没有。

2023-11-23 23:36:49 306

原创 Linux基础命令5

而图形化界面的话,关机是这个(也可以选择直接挂起,这样下次再打开直接点继续运行就行了,比再次重新开机要快一些),在系统里面,是有一个运行级别的,那么——我们现在正在运行的这个系统,其运行级别又是什么——数字几。如果在右上角直接点x号,就相当于把电源拔断了,这样做的次数多了,有可能系统就出问题了。可以发现这个跟我们之前在终端上面的操作是一模一样的,只是这个完全没有图形化界面了。其实,数字5这个运行级别就是——图形化界面的运行级别。那么为什么0是关机,6是重启,0和6又是什么意思。例如,切换到stu用户底下。

2023-11-23 19:32:38 108

原创 Linux基础命令4

所以这整句话的意思是,显示前半句话的内容,但因为太多了,就通过管道(|)来grep过滤一下想要的(ps)内容,减少不必要的内容显示。那么所有带有完整的hello字符串(包含hello的也行)的就出来了(必须是完整的,同样的hello)而这句话前半句的意思是显示(ls)usr目录底下的bin目录底下的所有东西,但这个就太多了,如图。* .c,* 就是所有的意思,这句话的意思就是查找所有的带有 .c 的文件。find加上文件的路径(也就是要查找的文件在根目录下的usr目录下的bin目录底下)

2023-11-23 18:08:44 310

原创 Linux基础命令3

mv剪切后,被剪切的文件只存在于新路径的底下,在原来路径底下已经没有了(所以剪切mv就是将文件从原来的路径换到另一个路径,文件换个地方,还是只有一份文件)cp拷贝后,被拷贝的文件在原来路径下,以及新路径底下是都存在的(所以通常说cp拷贝出来的是副本,因为cp拷贝是将同一个文件放在不同的2个地方路径)上图中,mv max.c tmp的意思是将当前路径下的目录文件max.c,移动到当前路径下的tmp目录文件底下去,不用加-r就成功了。并没有递归着去剪,先剪圆圈,再剪小方框,最后剪大方框啥的。

2023-11-22 23:38:07 74

原创 循环链表3

这个条件就很容易被遗忘写上,它一般写在循环体的最后一行,类似相当于循环执行一遍后的i++,然后在i++之后再判断循环条件2. 如果遗忘不写i++,就会造成死循环出不来等等问题。要改变链表结构,就要依赖前驱,每个前驱的next存储着下一个数据结点的地址,也就是依靠前驱的next来绑着后面一长串的数据结点,前驱就是从plist开始,结束于p->next的位置。所以用for循环的好处就是3个条件参数可以明确的写出来,不会遗漏。位置pos(在无特别说明的情况下)是从0开始计数的。

2023-11-21 18:31:51 65

原创 循环链表2

如果直接还是让p->next=plist,那就是直接让头插进去的数据元素跟头结点形成总共为2个结点的循环链表,丢掉了后面的一串数据,也就是后面的线没绑起来。例如当第二个有效数据元素进行头插时,先绑后面的,p->next被赋值为plist->next的值,而plist->next就是绑的后面一串数据。所以要用p->next=plist->next,它可以让第一个头插的结点绑向头结点,后面头插的结点绑住后面的元素线。——>左边像后面顺序连接。这里先绑后面的,后面是空就绑空,是数据1的结点就绑1结点。

2023-11-21 13:09:07 278

原创 Linux基础命令(2)

在上图中,没有写源文件a.c的路径,只写了一个文件名a.c,也没有写目的路径,只在a.c后面写了一个test.c,这句话的意思是把文件a.c复制了,复制成test.c了。cp (不写源文件的路径就是当前路径,pwd显示的,第一个要复制的文件名是当前路径下ls里面有的) 要复制内容(追踪显示文件内容用cat)的文件名 (目的路径,不写也仍然是当前路径下)上图中,这句话的意思是把 目录文件test复制,拷贝到当前路径下,拷贝后的文件名叫test01,这个test01相当于test的副本。

2023-11-17 11:45:22 42

原创 循环链表1

如上图,有的会在初始化这里malloc一个plist,那么此时的头结点就不是临时结点了,在可扩容顺序表里面,清空函数不能销毁malloc出来的东西,需要free,所以不能调用。那么什么时候需要调用它——在清空就能达到销毁整个动态内存的的要求时,就可以调用它。再销毁时,有时候会调用清空函数,有时候又不调用清空函数;在单链表里面,清空数据调用销毁函数能够达到清空的要求,那么直接调用就行。在定长顺序表里面,就可以调用——是因为定长顺序表里面就没有动态内存。————一个malloc对应一个free。

2023-11-15 15:26:45 42

原创 14——2

这里1/3是因为S=100的长度n=3(100占3位),然后1出现的占比是1/3(1在第一位),0出现的占比是2/3,因为0出现了2次,(第二位,第三位)——也就是当前数字0或1出现的总次数*出现总次数 / 串S的总长度。但是浮点数做比较的话,不一定能完全很好的等于,会有一定的误差,这个误差范围是十的负四次方。可以看到其信息熵的答案数值是唯一的,所以可以暴力枚举来一一跟答案对比。,因为这里ans保留了4位小数(e就是10的多少次方的意思)已知0出现的次数比1少,也就是说——v<u。

2023-11-15 00:21:30 87

原创 14——1

例如,我选了第一行的第十个数据元素2,再选第二十五个数据元素0,再选第一行最后一个数据元素2,然后选第二行第十八个数据元素3.可以看到在上面给出的数组元素中,并没有连续挨在一起的2023数字元素——就有人可能输出答案0。这句话的意思是,如图中月份12天数23时,就是1223;这道题数组长度100较大,所以也不能用Excel或计算器啥的凑巧。那么现在我选出来的数据组成的子序列就是——2023.也就是子系列的数据在原数组中不一定是连续存在的。子系列的意思是,从数组中选取几个数字。

2023-11-14 15:21:32 112

原创 单链表(8)

在不改变表的的结构的前提下的操作(打印,查找),用第二条p=plist->next(这是打印的第一个数据结点)获取前驱地址(目的为了删除,在插入和删除操作里面,找pos位置时,出循环后,p指向的都是pos位置的前驱)。用第二条(不改变链表原本的结构)的有:获取结点个数,查找key值search,输出show。综上所述:在进行要修改表的结构或是依赖于前驱的操作(插入,删除)时,用第一条p=plist。用第一条(要改变链表的结构,增加,减少结点个数等)的有:尾插,插入,删除pos位置值,

2023-11-13 14:48:48 53

原创 单链表(7)

如果结构还要留下继续下一次的使用,那么在下一次往后的每一次的插入删除操作进行之前,还要再多查一次这个结构还剩下几个结点,人也记不住,剩下旧的结点跟新的操作需求的结点一般也对不上,用完后还要再执行申请新的结点,多余些复杂不必要的步骤(每次操作前都要判断),——所以直接连结构一起销毁更好。这就是链表的插入比顺序表快很多的特点,顺序表中要插入一个数据,就把它后面的所有数据挨个往后移动一个格子,一个插入所有元素就要全移动一遍(特别是如果要头插,插入0号位置),所以说顺序表就是——大量的移动格子,也让速度慢了很多。

2023-11-13 14:26:58 53

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除