自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 存储体系结构以及局部性原理基础

60个人住在度假村,30个人关系比较好,房间连在一块的(顺序表内存中的体现),另外30个人关系差,房间都没有安排在一块(链表内存中的体现)。此时有辆可以承载20人大巴车(缓存),那么对于30个关系好的,只要给其中的第一个打个电话,说车到了,那么第一个人就能去找旁边的那个人一起去坐车。像是笔者在做ppt时,如果没有及时保存到硬盘中,电脑突然关机了,那么ppt所做的内容重新开机以后就不见了。这是因为,没有保存到硬盘以前,ppt的内容只存储在内存中;(这说明一定要及时保存文件!相反的,如果没有访问到,叫。

2024-10-19 17:17:18 245

原创 复杂度分析复习(C语言版)

int main()//语句1int x = 10;i < n;++i)++x;//语句2return 0;在上文中,笔者已经提到:问题规模的大小会影响时间复杂度。而C语言自带的clock函数就是为了搞清楚代码语句之间的用时(例如上述代码,clock函数用来计算从语句1到语句2所花费的时间)。打印出来的结果如下所示大O符号:是用于描述函数渐近行为的数学符号。(本质:计算时间复杂度属于哪个量级)用常数1取代运行时间中所有的加法常数在修改后的运行次数函数中,只保留最高阶数。

2024-10-07 20:55:07 722

原创 leetcode第189题:轮转数组(C语言版)

用 n 表示数组的长度,我们遍历原数组,将原数组下标为 i 的元素放至新数组下标为 (i+k)modn 的位置,最后将新数组拷贝至原数组即可。时间复杂度:需要用k次循环,里面套一层N-1次循环,最后循环k*(N-1)次;最坏结果中,k值为N-1,此时时间复杂度为O(N^2)。保存数组最后一个元素,然后数组全体元素后移一位,把保存的最后一个元素存放到数组的第一个位置,重复这一操作,直到执行完了k次。空间复杂度:未使用新开辟的空间,空间复杂度为O(1)。空间复杂度:未使用新开辟的空间,空间复杂度为O(1)。

2024-10-06 18:00:00 227 1

原创 leetcode面试题17.04:消失的数字(C语言版)

通过异或操作符号,相同的值为0,不相同的值为1;因为有 a^a = 0 已经 0^a = a 这两条性质,第一次遍历循环把数组全部的元素异或,第二次遍历循环再把numSize大小的元素异或,那么就可以找到只出现了一次的数字,即为消失的数字。时间复杂度分析:两次循环,结果为O(N)。时间复杂度分析:冒泡排序的时间复杂度为O(N^2),qsort排序时间复杂度为O(N*logN)。因此该思路可行,同时没有溢出风险,是最优解。先排序,再依次查找,如果下一个值不等于前一个+1,那么下一个值就是消失数字。

2024-10-05 21:38:14 480

原创 上海市高等学校信息技术水平考试 C程序设计(2021A场)全解

在顺序查找法中,如果要从n个学生中找到某个特定的学生信息,最坏的情况是这个学生是最后一个被比较的,这时需要比较n次。但是,如果学生是均匀分布的,那么平均来说,你会在列表的中间找到这个学生,也就是大约n/2次比较。k = i -- 含义:k = i = i - 1。2e-1 为 1.0^(-1)*2。

2024-09-21 22:21:06 461

原创 鹏哥C语言复习——函数栈帧的创建和销毁

在vs2013中,是其他函数调用了main函数。main函数是由 __tmainCRTStartup 调用,__tmainCRTStartup 是由 mainCRTStartup 调用的。(即如下图所示)因此,内存的栈区中应该先是在高地址处为 __tmainCRTStartup 和 mainCRTStartup 开辟空间;然后再调用到main函数,为其在较低地址处开辟空间;最后在main函数中调用其他函数,在低地址处为他们开辟空间。

2024-09-21 08:06:42 1059

原创 上海市高等学校信息技术水平考试 C程序设计(2020D场)全解

因此以B选项为例,由于B选项数组的每一行只有4列,1234四个字符就已经占满了,无处存放 '\0',因此出现了1234abcd的打印结果。在编程语言中,标识符是用户编程时使用的名字,变量、常量、函数、语句块都有名字。a为2,进入switch的default(类似于 else-if 语句中的 else),最后a的结果5。A选项 1 + 6 = 7,C选项 1 + 5 =6,因此结果为C。函数传参时,传的如果是数组名,那么传输的就是数组首元素地址。p指针初始化时,被赋予的是数组名,即数组的首元素地址。

2024-09-14 10:06:49 1066

原创 上海市高等学校信息技术水平考试 C程序设计(2020C场)全解

因此B选项中,就是把 p指针 所指向的存放a的空间数据赋值给了 q指针 所指向的存放b的空间数据。然后又打开了q包装盒,把复制完的数据A覆盖掉了q包装盒原本存放的数据B,因此此时的 b 变成了10。初始化时,p指针指向了存放a的空间,q指针指向了存放b的空间;而C选项中,只是把q包装盒里的数据B换成了数据A,此处是交换、交换、交换!C选项的操作,实际上就是把 q 指针从指向存放B的空间变为了指向存放A的空间,并没有修改a、b的数据。本题中,a为3,a==1的结果为0(假),因此最后的输出结果为D。

2024-09-05 17:49:30 1503

原创 上海市高等学校信息技术水平考试 C程序设计(2020B场)全解

答:对于整型数组,其元素都是整型,即使数组本身可以看作是一个指向整型的指针(例如arr[0]可以看作指针指向数组第一个元素),但因为想要通过函数来改变实参(scanf是库函数中的一员),那么就需要传整型数据的地址(&arr[0])。结构化编程提倡的是通过循环、条件判断等结构化的流程控制来管理程序的流程,这有助于保持程序的清晰和条理,也便于其他开发人员阅读和理解。而对于字符串数组来说,其元素都是指向字符的指针(例如 'a',实际上是指向a的指针),所以不需要再加上取地址操作了。因此B选项正确,C选项错误。

2024-09-03 17:28:12 1408

原创 leetcode第142题:环形链表 ||(C语言+引申问题全解)

slow一次走一步,fast一次走两步;相遇时搞个meet,再搞一个head,head和meet一起走,每次走一步;head、meet相遇处,即为结果。思路解释:当相遇时,slow走的路程:L+N;当相遇时,fast走的路程L+x*C+N。(x指fast走过的圈数,x>0)这时,可能有爱发问的读者有了疑惑:slow在1圈以内就能和fast相遇吗?答:of course。首先,slow和fast肯定能够相遇;若slow和fast相距M,那么随着两指针移动,M不断变小,直到变为0相遇。

2024-09-02 17:18:51 522

原创 leetcode第141题:环形链表(C语言+引申问题全解)

此处的。

2024-08-17 19:42:46 575 1

原创 单链表leetcode刷题/下(C语言版)

举个例子,链表A的1号结点与链表B的1号结点到最后一个结点一 一比较,找到相等的就直接返回;先定义两个指针,同时指向链表的首元结点,然后让fast指针向前先走k个结点。可以通过判断链表A和链表B的尾元结点是否相等,因为只要相交,极端情况下,两个链表的尾元结点都相等。被忽略的结点是属于长链表的,如果短链表的某个结点与长链表的被忽略的结点是相交的,那么短链表应该是更加长的那个,因此是矛盾的。然而,我们却可以先找到链表的中间结点,然后把中间结点的右边结点反转,然后比较首元结点和反转过后的第一个结点。

2024-08-15 17:02:03 1200

原创 双向链表复习(C语言版)

上述代码中,出现了大量函数,都有一个规律:即除了初始化函数外,传输的都是一级指针。这就是接口一致性。在项目的实际开发过程中,一会传个一级指针,一会传个二级指针,会增加代码的出错率,所以为了降低这个问题的出现概率,接口一致性一定是越高越好的。(当然,迫不得已的时候还是可以不管这个问题的。毕竟代码和我,有一个能跑就行)下班啦,下班啦!总算写完啦!

2024-08-14 21:46:55 1342

原创 单链表leetcode刷题/中(C语言版)

同时,因为存放数据小的链表和存放数据大的链表已经链接在一起了,所以只需要返回数据小的链表的首元结点,即可满足题目要求。通过尾插的办法,让原链表和复制结点组成的链表分开,将复制结点组成的链表变成一个新链表,返回新链表的首元结点,题目解决。创建一个新链表,比较两个原链表的结点val值大小,小的尾插到新链表中,然后比较当前结点val小的链表中的下一个结点和当前结点val大的链表的同一结点。遍历完原链表以后,让大的新链表的尾元结点的next置为NULL,然后将小的链表和大的链表链接起来。

2024-08-13 17:13:41 690

原创 单链表leetcode刷题/上(C语言版)

具体思路如下图所示。

2024-08-12 10:21:26 807

原创 单链表复习 (C语言版)

在函数当中,实际上pcur能直接看成pphead解引用了一次,即可以把所有的pcur看成是(*pphead),这就像是定义宏一样;这就像是传入了一个一级指针 int *a,然后在函数了假设变量int b = *a ,然后通过b的改变来改变传入进来的*a一样。而我们会在函数里使用到pcur = *pphead有两个原因,其一就是为了代码的可读性,其二就是为了让pphead指针一直指向首元结点。

2024-06-08 09:02:51 924

原创 鹏哥C语言复习——const和static

这影响了变量的生命周期,生命周期变长,和程序的生命周期一样。在C89中,数组长度是不允许使用变量的,当我们将一个由const修饰的变量来表示数组长度,依旧会报错:应输入常量表达式。解引用p指针,修改其值,最后p指向的n变量地址里存放的值改变了,也就完成了改变n的值的效果。const 放在*的左边,限制的是*p,意思是不能通过p来改变p指向的对象的内容,但是p指针本身是可以被改变,它可以指向其他对象的地址。const 放在*的右边,限制的是p,意思是不能改变p本身的值,但是p指向的内容是可以通过p来改变的。

2024-06-03 14:48:38 625

原创 leetcode第2题:两数相加(C语言)

而新链表不断创建以后,用于创建链表的指针也后移了,因此我们。

2024-05-29 23:48:27 777

原创 鹏哥C语言复习——调试

当我们发现程序中存在问题的时候,那下一步就是找到问题并修复问题。这个找问题的过程叫做调试,英文叫debug(消灭bug)的意思。如果是无断点的调试,直接按F10即可从主函数开始调试。

2024-05-28 23:06:24 1230

原创 鹏哥C语言复习——程序的编译、链接和预处理

C语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理阶段处理的。1 __FILE__ //进行编译的源文件2 __LINE__ //文件当前的行号3 __DATE__ //文件被编译的日期4 __TIME__ //文件被编译的时间5 __STDC__ //如果编译器遵循ANSI C(C语言标准),其值为1,否则未定义1是为了找到文件所在位置,2是指使用__LINE__语句的行号,不是所有编译器都遵循ANSI C(例如vscode2022)经过预处理以后,预定义符号已经替换成当前数据了。

2024-05-27 08:20:46 1074

原创 鹏哥C语言复习——文件

在这种情况下,由于第一行文本不足9(10 - 1)个字符,那么在这种情况下,只会读取第一行的5个字符(hello)以及换行(\n),然后第二行字符串直接跳过(不会跨行),存入'\0',如下图所示;而对于txt文件,是在硬盘里创建的,会永久保存在计算机中(注:先打开文件,再点击鼠标右键来创建txt文件,在编译器中即能可视化)fread函数与fwrite函数几乎是如出一辙的,因此如果存在一个文件,其中以二进制形式存放了5个元素(1,2,3,4,5),那么当我们要读取时,代码实现如下所示。

2024-05-27 08:19:15 635

原创 鹏哥C语言复习——内存函数

上述代码最终打印结果为16843009,这是因为memset函数是以字节为单位进行存放,在1个字节当中,10进制的1的16进制表示为:01,如下图所示。一个字节一个字节以01的16进制方式存入内存,而一个整型占四个字节,所以最后输出的结果为16进制下的01 01 01 01,因此才会输出非常大的一个结果。如果是以整型变量的数据大小(4字节)来拷贝,那如果我们传入的num大小为7就无法完成拷贝工作,因此需要以1个字节大小来进行拷贝。该函数是针对内存块进行拷贝操作,mem即为memory,是内存的意思;

2024-05-01 23:58:28 233

原创 鹏哥C语言复习——字符函数与字符串函数

对于最简单的那种情况,将两个指针传给函数以后,字符串1中先是a,不是满足条件的子串字符,向后移动一位是b,满足条件,此时字符串1和字符串2同时向后移动一位;还是以上述假设为例,会先将arr1中的'a'放入arr2的首地址处,然后再将arr1中的'b'放入arr2的第二个空间,以此类推,直到将arr1中的'\0'存入arr2数组。这时我们不禁又有一个疑问,那就是如果str2在传入时就为空怎么办,对于该库函数,是直接返回str1本身,因此还需要一句如下代码,函数功能才是完整的。

2024-04-27 23:58:23 1643

原创 顺序表leetcode刷题(C语言版)

对于本题,共有两种解法:思路一:创建新的数组,遍历原数组,将不为value的值放到新数组中,但本题不允许使用新的数组,因此该方法不行思路二:使用快慢指针,原数组基础上进行修改,源数据、目标数据,分别用src和dst两个指针指向;src指向的值为value,则往后走,即++;若src指向的值不是value,则nums[dst]=nums[src],dst++,src++上图是初始化情况,创建两个变量,让他们指向数组的首地址;

2024-04-21 12:00:57 913 1

原创 顺序表复习(C语言版)

而指针变量形式的形参才是真正改变地址中的数据的;答案是不能,因为size作为数组下标没有任何指向的元素,pos等于size相当于数组越界访问,应该用assert断点杜绝这样的事情发生。假如我要在pos=2的位置插入,那么就需要先把原有数据从后往前向后移动一位,最后在空出来的开头位置放入所需存放的元素。顺序表说:虽然我底层逻辑是数组,但是我提供了很多现成的方法,开箱即用,我就变成了一个新的很厉害的数据结构。顺序表是线性表的一种(线性表为具有相同特性的数据结构的组合),同时线性表可以存放任何类型的数据。

2024-04-20 19:10:05 1120

原创 二工大C语言版数据结构《实验报告2》:单链表

目录1.单链表的建立与打印2.单链表的查找3.单链表的插入4.单链表的删除5.循环单链表的修改与表示6.全部代码具体题目如下: 需要完成的代码如下:2.单链表的查找3.单链表的插入4.单链表的删除5.循环单链表的修改与表示全部代码是由我和我室友共同思考得出,快和我一起大声说:“谢谢室友!”

2024-04-15 01:27:10 252 1

原创 鹏哥C语言复习——数据存储

先从00000000开始,每+1,加到最大值,即127,即01111111,再+1,会变成10000000,上文已经说过,这个结果为-128,因此继续+1,即10000001,这是补码,换成原码结果为11111111,即-127,以此类推,最后一个数据为11111111(补码),即10000001(原码),即是-1。但是对于 9.6 这样的数据,2^(-1)为0.5,2^(-2)为0.25,2^(-3)为0.125,以此类推,最后就需要开辟非常非常多的0来满足0.1的需要。

2024-04-13 15:50:53 1063 1

原创 鹏哥C语言复习——结构体

上述代码当中,整型变量应该为4字节,即32比特;而_a: 2就是将a这个变量变成2比特有时候,我们不需要某个变量占用很大空间(例如某个变量只会是0或1),但是直接开辟必定会占用32比特,这种情况下我们就需要使用位段而上述代码中是以整型大小为标准来开辟空间的 因此先开辟了32比特,然后存放了 2+5+10=17 以后,再存放30超过了32比特;因此又开辟了32比特的内存空间,存放30比特的数据在上述代码中,先是开辟了8比特,存放7比特内容;然后又开辟了8比特,存放5比特内容;

2024-04-07 15:10:14 910 1

原创 鹏哥C语言复习——指针

概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)野指针的可能成因:1.指针没有初始化原因:*p没有初始化,就意味着没有明确的方向;一个局部变量不初始化的话,放的是随机值:0xccccccc,即非法访问内存,这种被称为野指针2.指针越界访问int main()//&arr[0]int i = 0;for (i = 0;i

2024-03-30 23:59:39 520

原创 鹏哥C语言复习——动态内存开辟

动态内存函数共有4概念介绍:结构体中的最后一个元素允许是未知大小的数组,这就叫做【柔性数组】成员柔性数组的初始化方式:a[ ] 或者 a[0](具体用哪个看编译器)1.结构体中的柔性数组成员前必须至少一个其他成员2.sizeof返回的这种结构体大小不包括柔性数组的内存3.包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小4.一个结构体里,柔性数组只能出现一个struct Sint n;int arr[];

2024-03-21 23:54:41 1008 1

原创 鹏哥C语言复习——青蛙跳台阶(小乐乐跳台阶)

第一种情况:1 余9 fib(9) | 第二种情况:2 余8 fib(8)小乐乐上课需要走台阶,因为他腿比较长,所以每次可以选择走一阶或两阶,那么他一共有多少种走法?n = 2 时,有1阶+1阶和直接2阶两种走法。当 n > 2 时,假设有10个台阶 (n为假设的台阶数)10 fib(10) ---计算走n个台阶的走法。由此可见fib(10) = fib(9) + fib(8)那么第一步走了1阶,还剩9阶;

2024-03-02 11:10:38 422

原创 鹏哥C语言复习——操作符

本文讲到了指针相关、结构体相关的操作符,但笔者由于篇幅原因并未展开(真的又臭又长)

2024-02-29 23:37:44 979 1

原创 鹏哥C语言复习——扫雷游戏

扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。游戏的基本操作包括左键单击(Left Click)、右键单击(Right Click)、双击(Chording)三种。其中左键用于打开安全的格子,推进游戏进度;右键用于标记地雷,以辅助判断,或为接下来的双击做准备;双击在一个数字周围的地雷标记完时,相当于对数字周围未打开的方块均进行一次左键单击操作。

2024-02-13 23:00:32 1065 3

原创 鹏哥C语言复习——三子棋

本文对三子棋游戏所有功能实现进行了详细讲解,敬请阅读

2024-02-12 21:02:43 2003 15

原创 leetcodeLCR 187题:破冰游戏(C语言+约瑟夫环)

笔者在解答本题以前,并未学过约瑟夫环递归公式,所以笔者先是用递归的思路思考本题。思路大致如下(为讲解方便,笔者使用了leetcode中“num=7,target=4”的这种情况):递归思想即是大事化小,小事化了;因此,我们可以在每次有人出局以后,都重新再调用一次函数,形成递归注:红底为报数又一次从头开始,因为7个编号是围成一个圈在报数(即按01234560123456……的顺序在报数),所以从头开始的第一个编号不一定为0。递归思想:第一轮报了4个数+3编号出局 + 按“4560124……”继续报数;第二轮报

2024-02-05 23:57:16 1329

原创 鹏哥C语言复习——函数递归

直至n为1,跳出if语句,printf了1这个值,在n为12的这一情况下的if语句执行结束,往后执行printf(12%10),即打印了2,然后又回到了n为123的这种情况,以此类推,最后成功打印1 2 3 4。num为1234,传给了print函数,故n为1234,比9要大,1234/10 = 123,即把123传输给了print函数(//len = 3,str == '\0'时,返回0数值给my_strlen("c")函数,以此类推,形成递归。在传参时,传入的是arr数组首地址,即'a'。

2024-02-04 18:52:14 936 1

原创 leetcode第509题:斐波那契数(C语言)

假设n=4,在fib函数中执行return fib(n-1)+fib(n-2)这条语句,即return fib(3)+fib(2);fib(3)即为n=3,在fib函数中执行return fib(2)+fib(1);又因fib(1)+fib(2)=1+1=2,所以fib(3)返回了2给了fib(4),所以fib(3)+fib(2)=2+1=3。第三种情况使用递归或者其他方法都可以,笔者在此使用了递归。3.n为其余情况,递归求f(n)2.n为1或者2,f(n)=1。1.n为0,f(n)=0。

2024-02-04 16:57:46 451 1

原创 leetcode第231题:2的幂(C语言)

假设x=3,当x=3时,执行return 2*mi(x-1)这一语句,开始递归;然后2*mi(0)返回给了mi(1)这一函数,可以看成mi(1) = 2*mi(0) = 2,返回了2给return 2*mi(1),诸如此,不难看出mi(2) = 4,mi(3) = 8;,首先读者需要明白一件事,那就是n

2024-02-04 12:34:02 820 1

原创 鹏哥C语言复习——函数基础和变量概念

并且因为在把xxx.h卖给其他公司时,可以把xxx.c中的内容编译成静态库,此时xxx.c中的代码会是一串乱码,那么别人就无法进行抄袭。相关程度越高,我们称之为高内聚,反之低内聚;由于笔者在大学学习期间,对函数部分的理解较浅,尤其是函数递归部分,所以本文会根据B站鹏哥C语言的视频对函数部分内容有一个大致介绍,并且会将函数递归部分单独写一篇文章。在完成了add.c功能,并在add.h文件中声明了add.c中的所有函数,那么打开add(人为命名)功能项目的属性,并将配置类型改成改为静态库类型,如下所示。

2024-02-03 11:52:30 549 1

原创 leetcode第4题:寻找两个正序数组的中位数(C语言)

于此同时,由于此法需要使用循环语句,同时nums1Size与nums2Size是题目给出的自变量,nums3中的元素个数是因变量,因此可能会出现(nums1/nums2)之一的数已经全部赋完了,所以循环退出条件可以是(count1>nums1Size或count2>nums2Size),接下来就把未赋完的那个数组中的各元素存入即可。1.因为nums1[0] > nums2[0],所以nums3[0] = nums1[0] = 1,nums1下次判断用第二个元素,nums3下次赋值用第二个位置。

2024-02-02 13:30:38 1158 1

空空如也

空空如也

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

TA关注的人

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