自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 力扣经典题目之->设计循环队列 的超详细讲解与实现

解释:得到判满条件(rear+1)%(k+1)== front,当rear的下一个就是front的时候就代表满了。解释:这是rear在非末尾的位置的判满, (rear+1)%(k+1)== front同样适用。满:(rear+1)%(k+1)== front(rear 的下一个是front就是满)解释:rear的边界处理:rear = (rear+1)%(k+1)2:front的边界处理 :front =(front)%(k+1)2:取模:rear = (rear+k)%(k+1)如果成功删除则返回真。

2024-07-23 16:20:48 439

原创 力扣经典题目之->用栈实现队列 的详细讲解与实现,看这篇就够了!

popst继续进行出栈的操作就能达到队列的先进先出(1 2 3 4 ),元素出完了后,再把pushst的元素像之前一样,通过出栈,放进popst,然后再对popst进行出栈,就能继续达到队列的效果(5 6)3:popst一定得有元素,才能进行对popst栈的栈顶的元素的return,所以要先判断popst是否为空,空的话,就根据思路,把pushst栈的元素全部都先出栈,再入栈到popst栈中即可!根据前文思路,我们把popst栈中的栈顶的元素return 即可,不需要出栈此元素,不然就成了出队列的函数了。

2024-07-17 22:04:12 416

原创 力扣经典题目之->用队列实现栈 的详细讲解和实现,看这一篇就够了!

1:根据前文思路,要区分开空队列和非空队列(QueueEmpty),然后将非空队列的前n-1(除了最后一个),移到空队列中,再将非空队列中的最后一个进行出队列,就达到了出栈的效果(后进先出)push,也就是入栈,根据我们前面的思路,我们是存储到非空队列上的 ,所以我们用队列实现中的判断队列是否为空函数QueueEmpty来找出非空的队列,找到后就将数据存储到非空队列中。实现栈(后进先出)的出栈,那我们要把队列1的5出掉,但是我们队列(先进先出)只能出1,这个时候,空队列(队列2)就派上用场了。

2024-07-17 18:09:55 868

原创 力扣经典题目之->回文链表 (超详细讲解与实现)

先用中间节点函数,得到中间节点,再将中间节点作为参数传给翻转链表函数,最后进行对比,有一个不同则false,全部一致,最后右半部分为空,则true。因为回文链表的左右部分对称,所以我们就将左右部分进行对比,我们将右半部分翻转一下,就可以进行左右部分的对比了。回文链表就是指 1 2 3 3 2 1 或 1 2 3 2 1这种左右对称的链表。只比对前三个,就是左右部分的比对,所以当有一个链表为空,停止比对即可。我们获取的中间节点就是右半部分的头结点,翻转链表的详细讲解见博主前文。本题博主采用第一种翻转的方法。

2024-07-13 14:48:18 273

原创 力扣经典题目之->返回倒数第K个节点(超快方法)

采用双指针法,一个slow一个fast,fast向后走k步,然后一起走,直到fast为NULL,此时的slow就是要返回的节点。解释:k=2,就让fast向后移动两次 ,最后返回slow的val值。

2024-07-13 10:46:02 169

原创 力扣经典题目之->删除有序数组中的重复项讲解 的讲解与实现

b:此时的strat的值是我们要返回的唯一元素的个数-1,因为start是从0开始的,所以我们要返回start+1。然后重复以上步骤,当end不等于start时,start向后移动一个,然后end赋给start。:因为都是0,二者都一样,然后end会向后移动一个,不如直接strat为0,end为1。创建两个下标,一个是第一个元素的(start=0),一个是第二个元素的(end=1):因为end要找第一个不同于start的元素,不断的放在数组的前部分。a:end移动,直到遇到不等于下标为start的元素。

2024-07-11 14:24:59 143

原创 力扣经典题目之->移除值为val元素的讲解,的实现与讲解

当end查到了val的时候,此时此刻,start和end都是指向val的,所以此时我们让start就不变了,让end去向后遍历,找到第一个不是val的值,从这个值开始,只要end指向的值不是val,就覆盖掉start指向的值。end赋给start,是因为在后面有重要作用,要用end指向的非val元素去覆盖start指向的val元素,并且这一步在找到val之前,对数组没有任何的影响。最后所有不是val的值都会被放在前面,然后返回start的值即可,他的值就是与val不同的元素的数量。

2024-07-09 21:05:08 525

原创 力扣经典题目之->轮转数组(反转数组)的实现,看这篇就够了!!

1:我们给reverse函数传过去的是,数组和需要反转的下标位,这样reverse就可以直接使用接收的left和right参数,如果你传的数字代表第几个数字,那你需要在函数里面进行一定的增减,才能直接在arr数组中使用。2:k要取n的余数,因为对n个大小的数组,轮转n的倍数次,相当于没变,所以取余会减少不必要的运算,并且k不取余,在后面的memcpy函数中,会造成超出范围,所以,取余至关重要!即可得到理想答案,如果你想不到,这很正常,轮转的思路,最简洁的就是这个,并且此方法不需要新的数组即可!

2024-07-09 14:15:34 194

原创 队列的实现(一篇包懂)

入队列需要空间,所以malloc一个节点的空间,将这个节点的值初始化为用户输入的x,并将该节点的next置空,以为这是尾插,尾节点的next为NULL。释放之后,要记得置空,其次不要忘记tail也要置空,因为只有一个节点的时候,head和tail指向同一个节点,你不置空tail,那么它就变成了野指针。再判断是否为第一次入队列,tail为NULL就代表该队列才刚刚初始化,所以就是第一个入队列,所以将head和tail都指向第一个节点。,这两个指针会指向队列中的节点,这种方式和其实就是哨兵位的另一种书写方式。

2024-05-22 19:05:43 570

原创 栈的实现(一篇包懂)

指向的是数组中下一个可插入元素的位置。如果用a接收,那realloc开辟失败,a如果之前不是空栈,那之前的栈元素也会丢失,而用一个tmp去接受,再去判断是否开辟成功会更好的保护数据。因为top的值和元素的个数一致,top一开始为0,入栈一个就top+1.出栈一个就top-1,所以直接返回top即可。让top--即可,因为top指向栈顶,这样如果下一个要入栈,根据入栈函数,它应该去占用之间4占用的空间。将x赋给a[top],因为top指向栈顶,它的值等同于元素的个数,top为下标就代表栈顶的后一个空间。

2024-05-22 15:46:38 952

原创 力扣经典题目之->随机链表的复制 的讲解与实现

因为cur的下一个节点是复制节点,这样才能实现复制节点的random指向对应的复制节点的random ,每一次copy指向的节点都对应着cur指向的节点,所以,copy的random要和cur一致,但是一致要体现在复制节点上,而不是原节点,这样才能形成新的链表。2:进入循环创建了cur的下一个节点:next节点,然后结尾cur变成了next,从而向后移动,再次进入循环,next又借助新的cur向后移动。在原链表的每个节点后面,复制并链接一个节点,该节点的值和原链表的节点一致。1:因为题目要求新的链表由。

2024-05-20 14:30:47 295

原创 双向链表(双向带头循环)的增删查改的实现(简单易懂)

每个节点除开存有数据,还有一个指针指向前一个节点,一个指针指向后一个节点,尾节点和哨兵位互相指向,从而形成一个循环。当只有哨兵位的时候,first也就是哨兵位,以上的步骤依旧可以正常的头插,所以不需要额外增加情况的判断。参数为phead的,一定需要断言,因为不管该链表是否存在节点,都不会为空,因为最少也存在哨兵位的节点。当只有哨兵位的时候,tail也就是哨兵位,以上的步骤依旧可以正常的尾插,所以不需要额外增加情况的判断。尾插一个节点进来,不但要进行尾节点和尾插节点的循环,还要进行尾插节点和哨兵位的循环。

2024-05-12 21:12:23 835

原创 力扣经典题目之->环形链表II(给定一个链表的头节点 head ,返回链表开始入环的第一个节点)的超详细讲解与实现

由情况1可知,在slow进入环之前,fast在环内走的长度一圈都没有,在slow进入环后,fast开始追赶,最后走了一点距离,追上了slow,此时fast在slow进入环之前在环里走的距离+在slow进入环之后在环里追击所走的距离= 一圈,所以n的最低取值为1。情况2:a指针从相遇点开始走到和b指针在入口点相遇的时候,a指针在环内走了 C - X + (N-1) * C ,走了N-1圈 ,然后再走了C - X 的长度。由上图可知,slow走的距离为L+X,fast走的距离是L+C+X,

2024-05-12 17:04:39 910 1

原创 力扣经典题目之->环形链表(判断链表中是否有环)的讲解与实现

3:当slow和fast遍历的时候,如果fast和slow相等,就代表该链表带环,因为以上两种情况slow和fast永远不会相等。fast->next指针为空,代表这是一个奇数个节点的链表,fast1,3,5这样的移动,最后一次会到尾节点,所以它的next为空。fast指针为空,代表这是一个偶数个节点的链表,fast1,3,5这样的移动,最后一次会到尾节点的下一个节点,所以fast为空。而相等只会出现在slow和fast指针两个都进入了环,彼此开始进行追击,总有一个节点,二者会相遇,即slow=fast。

2024-05-12 15:33:33 180 1

原创 力扣经典题目之->相交链表(返回相交链表的公共lesshead->next结点)的实现与讲解

那为什么不while(curA) 呢,这样lenA就是正确的,因为下面的尾节点比较的时候,curA和curB已经来到了尾节点的后一个节点,这样的话无法比较尾节点,除非在计算长度的时候,还要保留前一个节点的指针,这样比较麻烦,所以宁愿lenA,lenB赋值为1.让长的那一条链表先走长度的差距,这样会距离交点的距离相等,然后再对两条链表的节点对应着去比较。长度的差距一定是在相交节点之前就决定了的,因为相交节点之后的链表完全相同。,因为,一但有一个相交节点,比如图中的c1,那之后的链表一定是一致的,

2024-05-10 17:04:39 141

原创 力扣经典题目之->切割链表 的问题的讲解和实现(带哨兵位)

链接完成后的链表的最后一个节点的next一定要置空,因为该节点在一开始的链表中的next是有指向的,而他是最后一个,它的指向没被改变,有可能会造成死循环,成环!需要注意的是:ltail这个尾节点连接的ghead的下一个节点,而不是ghead这个节点,因为两个链表的哨兵位是我们创建的,后面都会被释放。两个链表拼接到一起的新链表的头指针,不是哨兵位,而是哨兵位的下一个节点,因为题目给的链表不存在哨兵位,哨兵位只是我们方便自己进行操作。将小于x的放进一个新的链表,将≥x的也放进另一个新链表。

2024-05-10 15:53:11 187

原创 力扣经典题目之->合并两个有序链表的两种方法(带哨兵位和不带哨兵位)

当一个链表比较完了之后,就没必要进行比较了,此时,另一个链表的剩余部分怎么处理,很简单,直接让排完序的那个链表的尾指针指向这个链表的剩余部分即可,因为剩下的都是大于排好序的链表里面的每一个的,而且剩余的自己也有顺序,所以直接链接即可。两个链表的对应节点进行比较,然后取小的尾插,直到某一个链表为空,再把剩下的不为空的链表链接过去即可。应先对传过来的两个链表中存在空链表的情况,率先进行处理,list1为空,return list2,反之。

2024-05-08 14:18:25 494

原创 力扣经典题目之--->返回链表的中间节点题目讲解(超快方法)

1:slow指针一次跳一个节点,fast指针一次跳两个节点,这样当fast到尾节点的时候,slow刚好到中间节点,但是奇数个的时候,fast不会刚好的停留在尾节点,而是会越过尾节点,但是此时的slow指针依旧是指向中间节点的。所以while的判断条件是;fast && fast->next,分别针对奇数个节点和偶数个节点。采用快慢指针方法来解决。

2024-05-08 13:42:28 175

原创 力扣经典题目之->反转链表题目讲解(最快的两种方法)

采用三指针方法,n1,n2,n3,n1和n2负责反转,n3负责找到下一个(因为反转之后就无法找到下一个)到n2为空的时候结束,这时候代表最后一个节点也已经进行了反转。n2指向n1,此时节点1和节点2的链接断开。

2024-05-08 13:27:35 156

原创 力扣经典题目之->移除链表元素,看这篇就够了!!

创建两个指针prev和cur,初识位置cur为头指针,prev为NULL,然后两个指针往后移动开始去寻找与val值吻合的节点,最后找到节点的时候,cur指向该节点,prev指向该节点的前一个节点,现在我们的目的是要删除这个cur指向的节点,让cur去指向该节点的下一个节点!所以我们先将prev的next修改为该节点的下一个节点,将该节点的前后两点链接起来(prev->next = cur ->next)然后再让cur指向该节点的后一个节点(cur=prev->next )。

2024-05-08 12:03:15 451

原创 力扣经典题目之->合并两个有序数组题目讲解

取三个位置,第一个end1位置为nums1数组有效值的最后一个(第m个元素,下标为m-),第二个end2是nums2数组的最后一个元素(第n个元素,下标为n-1),这两个位置,倒着比较,较大值就储存到nums1中最后的位置(end),如果相等取nums2和nums1到end去都一样,这样每次比较的较大值就从nums1数组的最后面依次往前插入。end和end2都往前移动一个位置,然后end1和end2比较,结果是end1大,所以end变成了end1。[1,2,2,3,5,6] ,这就是非递减顺序。

2024-05-08 10:58:57 282

原创 单链表(无头单向非循环)的增删查改的讲解与实现(一篇包懂)

让tailprev指向倒数第二个节点(尾节点的前一个节点),然后释放掉tail指向的尾节点,然后把tail置空,最后把tailprev(指向倒数第二个节点)的next置空,因为此时倒数第二个节点就是尾节点了,尾节点的next应该为NULL。头删就是让头指针去指向原本头指针指向节点的下一个节点,然后再去释放掉第一个节点的内容,而为什么不直接用*pphead(plist)去进行操作,因为这样释放的时候会释放掉操作后头指针指向的第二个节点,所以需要将头指针保存到新变量newhead中,这样才能完美的完成操作!

2024-05-05 22:01:22 603 1

原创 顺序表的增删查改的实现以及讲解(一篇包懂)

1:断言:,不仅是对接收到的结构体指针进行断言,还是对pos的值进行断言,pos应该处于0~size-1之间,也就是>=0,<size,超过这个两端,就越界了。1:断言:,不仅是对接收到的结构体指针进行断言,还是对pos的值进行断言,pos应该处于0~size-1之间,也就是>=0,<size,超过这个两端,就越界了。1:断言:,不仅是对接收到的结构体指针进行断言,还是对pos的值进行断言,pos应该处于0~size之间,也就是>=0,<=size,超过这个两端,就越界了。capacity已经在。

2024-05-01 21:00:53 918

原创 递归实现斐波那契数列的空间复杂度的讲解

到左下的Fib(2)的时候,此时不同的Fib栈空间个数达到了最大,也就是n个栈空间,然后就会往回递归,并且往回递归的过程中还是重复利用之前的栈空间,所以空间复杂度应该是O(N)!),此时的Fib(1)会使用之前Fib(2)的栈空间,而不是额外的新的栈空间,然后Fib(1)达到了if的限制条件,然后回到了Fib(3)(此时的Fib(3)完全执行完毕,和最下面的Fib(2)执行完毕一样,此时执行完毕的Fib(3)会返回到上一级的Fib(4)(),然后Fib(2)执行完毕返回到上一级的Fib(4)(

2024-04-24 20:54:29 157

原创 冒泡排序的时间复杂度的讲解

遍历了n-1,n-2,n-3......才让数字来到该处于的位置,而这是一个等差数列(n-1,n-2,n-3......),该数列,首项为1,尾项为n-1,求和后,最大的影响项是n^2/2,所以时间复杂度为。最好就算是进来就是有序的,但是呢,它也得通过一遍的遍历才知道是否是有序的,所以还是n-1次,所以时间复杂度为O(n),而不是O(1)!只有两个数位置不对,就是n-1+n-2,也就是2n-3,也就是O(n)综上所述:时间复杂度为:O(n^2)。

2024-04-17 18:41:50 351

原创 二分查找的时间复杂度的讲解

所以x=log以2为底N的对数,简写成logN,在复杂度里面只有以2为底的可以简写,但是和数学里的lgN,没有任何的联系!因为最坏情况就是找不到和查找区间只剩一个值的时候,所以此时数据的个数就为1。综上所述:二分查找的时间复杂度为O(lgN)。由图可知:查找了多少次,就除了几次2。

2024-04-17 18:36:52 379

原创 消失的数字的两种巧妙方法

0^3然后去^下一个数,结果下一个数是4,3消失了,所以大致的流程变成了0^3(上面for循环没有消失的3)^4(下面for循环的3消失了,所以是4)^4(接着就是上面个for循环的4)^5v5.....,所以我们最后的x就变成了那个消失的数字,因为0^3^4^4^5^5就等同于0^3^0^0,也就是3。所以我们可以知道,如果两次for循环,x都面对同一个数,它会先变成这个数(0^a=a),然后再变成0(a^a=0),所以如果上下循环的数是同一个,x经过变换还是0。

2024-04-17 18:28:38 228

原创 scanf/fscanf/sscanf和printf/fprintf/sprintf的使用和对比

如果发生写入错误(例如,磁盘空间不足、文件无法访问等),则“错误指示器”(ferror)会被设置,并且函数会返回一个负数。它可能返回成功处理或填充的参数数量,这个数量可能与预期的数量相匹配,也可能更少。: 当尝试匹配某些内容(例如,从输入中查找特定的模式或字符串)时,可能会失败。: 如果函数试图读取文件,并且已经到达了文件的末尾,那么它将停止读取,并且返回的项目数量可能会少于预期。这个数量可能与预期的项目数量相匹配,但由于匹配失败、读取错误或达到文件末尾,它也可能更少(甚至为零)。

2024-03-30 16:03:09 949 1

原创 八种顺序读写函数的介绍(fput/getc;fput/gets;fscanf,fprintf;fwrite,fread)

(fput/getc;fput/gets;fscaf,fprintf;fwrite,fread)的使用介绍

2024-03-28 22:53:15 2178

原创 动态内存函数开辟的经典的笔试题

动态开辟内存忘记释放(内存泄漏)(一般是在某个函数中进行开辟,然后回到主函数,无法使用开辟的空间,导致泄露)(动态申请的内存空间,不会出了作用域就自动销毁(还给操作系统),只有free,或退出程序才能还给操作系统)。1,数组的创建,出作用域会销毁这个数组的内容,str的确指向了这个数组,但是已经变成了野指针,因为指向的空间已经不属于它了。: p的移动,导致了free的时候,不能够完全释放掉malloc开辟的全部内存。1,p只是str的一份临时拷贝,无法让str改变,因为采用给的是值的传递。

2024-03-27 15:25:59 211

原创 几种动态内存函数的理解(malloc,calloc,realloc,free)

函数的出现让动态内存管理更加灵活,有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时候内存,我们一定会对内存的大小做灵活的调整。有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了。的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用,这样函数返回的是一个新的内存地址。1 的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化,返回的是增加前的空间的首地址。

2024-03-27 14:58:25 804

原创 通讯录的模拟实现(增删查改,清空,排序)

联系人结构体要满足题目要求,另外我们还要创建一个通讯录结构体,其应该包含多个联系人结构体(联系人结构体数组)和联系人人数(sz),因为后面增加删除,以及联系人的访问都会用到sz,其次对几个重要变量的重定义,以后方便修改,不用去到处找修改的变量在哪里。text.c(大纲)的意义在于,明确整个程序的思路,程序开始,创建了一个通讯录,并且对其初始化为0,然后我们再让用户进行选择需要实现的功能,用switch case语句来实现多种功能。拥有增加,删除,搜索,修改,展示(所有联系人),退出功能。

2024-03-23 19:47:34 581 2

原创 如何用联合(共用体)union验证系统大小端

由联合体的特点,可知上图,char c 和 int i 共用四个字节,假设是小端,则由左到右是低地址到高地址,四个字节的内容如图所示01 00 00 00。如果第一个字节是1,则证明是小端,因为小端是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地。

2024-03-22 15:09:37 352 1

原创 计算联合体union的大小

联合的成员是共用同一块内存空间的,这样一个联合变量的大小,至少是最大成员的大小(因为联。是最大成员的大小,也就是c数组的大小14,所以联合体最终的大小为离14最近的4。当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。是最大成员的大小,也就是c数组的大小5,所以联合体最终的大小为离5最近的4。所以Un1中c的对齐数是1,i的对齐数是4,所以最大对齐数是4,目前。所以Un2中c的对齐数是2,i的对齐数是4,所以最大对齐数是4,目前。的倍数,也就是16。

2024-03-21 17:00:28 539

原创 计算结构体的大小(结构体的内存对齐)

3,c2本身大小为1,而vs默认对齐数是8,所以1和8,进行比较,较小值为1,所以对齐数为1,那c2就要去找1的倍数处的地址(图中右边的数字),任何一个数都是1的倍数,所以就选择了紧接着i的红色格子。而c1和c2和i的对齐数中,最大的是4,所以结构体大小应该是4的倍数,因为此时结构体已经9个字节了,最近的符合规则的就是12,所以又往下浪费了3个字节。嵌套的结构体这个整体要对齐到自己的最大对齐数(也就是它内部元素的最大对齐数)的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

2024-03-21 16:36:05 295

原创 秒懂memmove的模拟实现

就是按照8,7,6,5,4的顺序复制给5,4,3,2,1,无法得到4,5,6,7,8,6,7,8,9,10(正确)而是得到7,8,6,7,8,6,7,8,9,10。,就是按照4,5,6,7,8的顺序复制给1,2,3,4,5,可以得到4,5,6,7,8,6,7,8,9,10(正确),就是按照4,5,6,7,8的顺序复制给6,7,8,9,10,可以得到1,2,3,4,5,4,5,4,5,4。,就是按照8,7,6,5,4的顺序复制给10,9,8,7,6,可以得到1,2,3,4,5,4,5,6,7,8。

2024-03-20 16:33:36 873 2

原创 memcpy的模拟实现

void* 类型的指针,不能进行指针运算和指针解引用,所以我们要将其进行强转之后再进行运算和解引用,那我们选择的强转的类型就是char*,逐字节的复制,会适用与多种类型指针的复制。因为返回的是dest指向的首地址,而dest指向的地址在复制的过程之中会被改变。3,因为不知道我们的源头数组和目的数组的类型,所以均用void * 来接收和返回,size_t num则是确保了复制的字节数是正数。的理解在于进行逐字节的复制,而num就是我们要复制的字节数,刚好作为循环条件。的内存位置,然后返回目的数组的起始地址。

2024-03-20 14:40:28 346

原创 字符串的左旋讲解

作用在于对于大于字符串长度的左旋,会%后再进行左旋,避免错误,左旋ABCDEFn个字符,代表左旋一个字符循环n次。将总体字符串BAFEDC再进行逆序,得到CDFEAB。a.先把第一个字符,用临时字符变量存起来。ABCDEF的左旋可以分为三步,以左旋。c.最后再将第一个字符赋给最后的字符。将后面剩下的字符逆序得到FEDC。b.然后后面的依次向前移动一个。要左旋几个字符,就循环几次即可。比如左旋7,其实就是左旋1。将前两个字符逆序得到BA。

2024-03-19 23:51:42 225

原创 杨氏矩阵的查找(复杂度<O(N))

如果n<它,代表最后一列也不用找了(因为它是第三列(最后一列)里面最小的)如果n>它,代表最开始一行已经不用查找了(因为它是第一行里面最大的):n>关键数,最开始一行不用找了,行+1。:n<关键数,最后一列不用找了,列-1。经过对行和列的不断变换,最终会找到n。被查找的数(n)与关键数进行比较。先找到一个最关键的数字,

2024-03-19 22:54:25 204

原创 strstr的模拟实现

所以我们要将str1和str2分别赋给一个新的字符指针,如图中的cp和s2,然后再将cp赋给s1,因为我们遍历比较的过程中,str1需要一个指针去遍历比较(s1),一个指针去指向某个可能首次出现str2位置(cp)。如果*s2为'\0'的时候,就代表已经在str1中找到了str2,因为不把s2的全部字符遍历完,不可能来到s2的'\0'。因为比较的过程中str1中的cp会因为比较的结果(比较不吻合)向后移动,当cp移动到最后一个字符'\0'的时候,也就代表再也在str1中找不到str2了,所以退出循环。

2024-03-17 21:32:02 522

空空如也

空空如也

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

TA关注的人

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