自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【数组】螺旋矩阵

题目实际上是循环由外圈到内圈顺时针填充数字,关键是如何处理好每条边及循环条件。我们处理每条边时设定一个统一的规则:每条边从第一个元素开始填充,但是不填充最后一个元素。这样处理每条边的时候都有一个统一的处理办法,也方便设置循环条件,这个规则就是本题中的循环不变量。此外还要考虑两个问题:1、填充内圈时相对于外圈边界在内缩。2、n为奇数时填充完所有圈还剩一个中心点需要填充。

2025-09-24 16:57:16 221

原创 【数组】区间和

思路:暴力求解就是每次读取区间,然后把区间内的数组依次相加。如果求和m次,每次都从头加到尾,时间复杂度为O(m*n),如果m很大,时间复杂度会很大。如果用一个数组p专门保存子数组的和(前缀和):p[i] = arr[0] + arr[1] + ....... + arr[i],那么求区间[a,b]之间的和时,只需要p[b]-p[a-1],时间复杂度为O(1),相较于之前时间复杂度降为O(m)。

2025-09-11 23:26:25 198

原创 【数组】长度最小的子数组

用滑动窗口可以压缩成一个for循环:滑动窗口依旧是两个指针,for循环(终止条件:窗口尾指针未抵达数组末尾)控制窗口尾部指针的移动,窗口内的数字之和小于目标值时移动窗口尾指针。for循环内部用一个while循环(终止条件:窗口数字之和小于目标值)控制窗口头部指针的移动,当窗口内数字之和大于等于目标值时,记录此时的窗口长度,并移动窗口头部指针同时更新窗口内数字之和,再次进入while循环,如果此时窗口数字和小于目标值跳出while循环移动窗口尾部指针继续寻找新的满足条件的子数组;个正整数的数组和一个正整数。

2025-09-09 23:46:20 345

原创 周期字符串

题目:大牛解答:周期字符串问题(两种方法) | 春水煎茶

2025-06-11 00:37:19 210

原创 滑动窗口最大值和最小值

每次窗口移动1位,首先判断位于队首的元素是否被移除窗口,如果是,出队,否则将新元素与队尾元素比较,如果大于队尾元素直接入队,否则将队尾元素出队,直至新元素入队,作为备选的最小值。窗口进行滑动时,需要快速获取min和max,因此需要一个结构来保存最值,而不是临时计算。动态的最值更新容易联想到单调栈,但是这里需要频繁增删元素,因此用双端队列,front删除移除窗口的元素,back增添移入窗口的元素。创建两个双端队列,一个记录窗口最小值,一个记录窗口最大值。

2025-06-10 22:33:00 262

原创 放苹果(递归)

即先放n-1个苹果再放剩下的一个苹果,但是这种按照过程特征来构建的状态转移逻辑容易出现重复的错误,比如有2个苹果3个盘子,先放一个再放另一个会出现110、011、101的重复错误。状态转移逻辑为:countWays(m, n-1) + countWays(m-n, n),即前一种情况为至少有一个盘子为空,于是变成了m个苹果放n-1个盘子;(2)m-n可能导致苹果数小于0,直接返回0(也可以用if语句比较mn替换,如果m<n,返回countWays(m,m))

2025-06-10 16:39:08 192

原创 oj犯罪团伙判断(并查集+异或标记)

每次D信息都可以提供两起案件的关系,把已经确定关系的案件放到一个集合中。把案件看做结点,用一个relation数组来表示结点与其父节点的关系,0表示同一个团伙,1表示不同团伙。这样一直做异或运算到根结点,可以确定当前结点与根结点的关系,进而可以确定同一个集合中任何两个结点之间的关系。2、获取D信息,unit两个结点:find两个结点的根节点,如果相同,那么在同一个集合中,关系已经确定,无需操作;如果不同,把一个结点(x结点)的根结点挂到另一个结点(y结点)的根结点上,并。

2025-06-06 13:22:39 157

原创 棋盘问题(放置棋子)

逐行尝试,放完第一行放第二行……每行的#都要尝试,同时用一个数组来标记一列上是否已经存在棋子。在n*n的矩阵内描述棋盘,棋盘的“形状”输入决定,只能在#的位置放棋子,棋子不能同行,不能同列。

2025-05-29 18:28:53 247

原创 求图的中心点

反向建图,这样v的偏心度就变成了v到w的最短距离中的最大值,可以用Dijkstra算法来求v到所有w的最短距离,再取个最大值就是v的偏心度。对所有结点使用Dijkstra算法求偏心度,取偏心度最小的点,即为中心点。

2025-05-23 00:50:42 179

原创 求树的重心

本文介绍了如何在一棵树中找到重心,并计算删除重心后剩余连通块的最大节点数。树的重心是指删除该节点后,剩余连通块中节点数的最大值最小的节点。通过邻接表存储树结构,并使用深度优先搜索(DFS)递归遍历树,计算每个节点的子树大小。在回溯阶段,计算删除该节点后所有子树和“上面剩余部分”的大小,取最大值记为maxPart,最终取所有节点中最小的maxPart,其对应的节点即为树的重心。代码实现中,使用subtreeSize数组记录子树大小,并通过DFS遍历树,最终输出重心及删除后的最大连通块大小。算法的时间复杂度为O

2025-05-22 17:50:54 334

原创 寻找最小高度树的树根

文章介绍了一种通过“剥洋葱”法寻找树的重心(中心)的算法。该方法通过逐层剥离叶子节点,逐步逼近树的中心,最终剩余不多于两个节点即为树的重心。文章详细解释了算法的思路,并提供了C++代码实现。代码首先构建邻接表和度数表,然后将所有叶子节点入队,通过迭代剥离叶子节点,直到剩余节点不超过两个。最后,队列中的节点即为最小高度树的根。文章还展示了代码的运行结果,验证了算法的有效性。

2025-05-17 22:02:37 237

原创 利用KMP找出模式串在目标串中所有匹配位置的起始下标

对于第一种情况,则需要将next扩容一位,即next数组最后一位的值是整个模式串中最大相同前后缀的字符数,然后在第一轮匹配完成后,如果 i 没有到达目标串末尾,让 j = next[ j ]即可。到这一步后,我们不能直接将j = 0然后开始下一轮匹配,因为已经匹配过的部分(蓝色部分)中仍然可能存在与目标串重叠的子串。找到蓝色部分的最大相同前后缀,利用next数组,将 j 回溯到最大前缀的后一个位置开始与目标串进行第二轮匹配。问题关键:完成首次匹配之后需要继续进行模式匹配。next数组是第二种情况。

2025-05-04 17:31:47 333

原创 Numpy数组与np.newaxis

Numpy数组的形状(a, b, c)由外向内逐层定义,含义:a个外层元素,每个外层元素有b个中层元素,每个中层元素有c个内层元素。a、b、c可分别理解为层、行、列。例:三维数组[ [ [1, 2] , [ 2, 3] ] ]形状为(1,2,2);[ [ [ 1, 2] ] , [ [ 2, 3] ] ]形状为(2,1,2)np.newaxis本质上是个占位符,用来在指定位置添加一个维度。输出 (3, 1, 2)输出 (3, 2, 1)

2025-03-27 06:28:46 234

原创 numpy数组广播机制

NumPy数组的广播机制是一种自动扩展数组形状的机制,使得不同形状的数组能够进行元素级别的运算,而无需显式地复制数据。它通过特定的规则调整数组的维度,使得它们的形状相容,从而实现高效的运算

2025-03-27 02:22:17 412

原创 循环旋转判断

请设计一个线性时间的算法,判断字符串 S 是否是另一个字符串 S’ 的循环旋转。例如, arc 和 car 是彼此的循环旋转。,如“arc”+“arc” = “arcarc”,如果S是拼接字符串的子串,那么S就是S’的循环旋转。

2025-03-25 14:23:50 160

原创 寻找左边第一个更小值

从左往右将序列中的数与栈顶元素比较,如果小于栈顶元素,则弹栈并继续比较,直到栈顶元素大于等于当前的数或栈空。如果当前数小于栈顶元素那么栈顶元素就是当前数左边第一个更小的数(因为栈具有先进先出的性质);(2)寻找序列左侧第一个更大值(单调递增栈):方法与上面类似,一直寻找大于序列数的栈元素,小于的出栈。给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。单调栈即从栈顶至栈底单调递增或者单调递减的栈。(1)寻找序列左侧第一个更小值(单调递减栈):方法如上。

2025-03-22 15:26:29 362

原创 链表的环的入口问题

1、慢指针S每次移动一步,快指针F每次移动两步,两个指针同时出发,必然在C点相遇,首次相遇时,快指针回到原点A并且速度变为每次移动一步,接着两个指针继续移动,再次相遇的位置为环的入口B。那么当快指针回到原点并以速度1出发,它从A到B的时间和慢指针从C到B的时间是相同的,因此二者再次相遇时即为环的入口。3、为什么相遇后快指针回到原点速度变为1再次出发二者相遇时刚好到达环的入口?快指针超越慢指针有两种情况:(1)超越一步(2)超越两步。(2)如果超越两步,那么上一步超越一步,上上步便会相遇。

2025-03-17 12:07:00 315 2

原创 求时间复杂度

外层循环n/2次,因为要满足内层循环的2 * i <= n。

2025-03-12 11:27:41 98

原创 求解三元组最短距离

2025-03-12 10:22:10 279

原创 C语言计算超大阶乘

利用C语言计算一个超级大的阶乘!

2024-01-09 22:12:44 467

原创 【C语言易错】for语句易错

原因:开始时 i = 0,判断条件为真,打印0,接着i ++ 变成1,此时不满足判断条件 “i!= 1”,于是不打印1。然后,很容易认为 i 继续自增并打印2 3,这是不对的,因为判断条件一旦为假,循环就结束了,而不是执行变量调整部分继续判断.......这是一个易忽略的点!错误结果:0 2 3。

2023-11-18 13:59:18 418

原创 【C语言疑难杂症】调试查看内存窗口时全是问号

进入调试模式时,我们位于程序的起始位置,而此时程序没有进行任何操作,没有创建变量i 、 没有给变量i分配地址.......,也就是此时编译器在此时根本不知道变量i的存储在,也就谈不上查看i的值了。按F11,再往后走几步,直至程序创建了变量 i ,那么也就完成了赋值、分配内存的操作。然后就可以在内存窗口中查看i的值了。我们创建了一个变量i并赋值,此时进入调试模式并用内存窗口查看变量i中的值时,却发现全是问号。编译器:VS2022。

2023-10-25 12:06:41 1697 1

原创 【c语言易错】if语句常犯错误

编译器在执行上述代码时,执行顺序是先判断“a==b”并返回一个值作为表达式“a==b”的结果,然后判断“a==b==c”,然后此时表达式“a==b”已经被返回值1(假设前面的判断结果为真)替代,也就是说,此时的“a==b==c”变成了“1==c”,这表示判断c的值是否等于1,显然与最初的目的不符。原因同第三点一样,应当改为b>=a && b<=c。判断相等时应该使用“==”,"="是赋值运算符。正确的代码应该是:a==b && b==c。

2023-10-20 13:30:17 1138

原创 【C语言易错】设定数组大小时不能使用变量名

使用数组时,在某些特殊情况下,我们需要去更改数组的大小,但是当数组的使用次数很多时,更改起来就较为麻烦,于是想到用变量来代替数字去设定数组的大小。但是并不能这么做,这是一种语法错误。解决方法:定义一个宏代替变量。可以看到,此时编译器不再报错。

2023-10-18 18:16:38 861

原创 【C语言疑难杂症】char 为何能表示 -128

不难发现,时针顺时针走一步,等价于逆时针走11步,我们将 -11 称为 1 的“补数”,同理,-10 是 2 的“补数”......我们还能发现,互为“补数”的两个数的绝对值之和是这个计量系统的模。如果将顺时针走的步数用正数来表示,将逆时针走的步数用负数来表示,那么我们就能发现,时钟这个计量系统能够表示的数值范围由 -11 ~ 11 变成了 -12 ~ 11!的规律,于是,将逆时针走0步替换为逆时针走12步,也就是将-12作为0的“补数”,这样就恰好满足规律了。“原数”+“补数” = “模”

2023-10-18 11:16:52 1249

原创 【C语言错题笔记】

易知代码是将-1、-2、-3、... 、-1000逐个装入数组arr中,但是应当注意数组的类型是char(字符数组),而char的数值存储范围是-128~127,因此-128以后的数字装入数组中时会发生某些改变。同理,接下来是126、125 、 124 ...... 、1 、0 、-1、-2 、-3........,根据ASCLL表可知,ASCLL码值0对应的字符是 ‘\0’,当函数strlen读取到0时就会停止,1~128~0 总共255个数(0不计在内),因此最终的输出结果是255。

2023-10-16 14:04:24 93

原创 【C语言错题笔记】

i是一个无符号数,所以只能表示非负数,永远也不可能小于0,进而陷入打印的死循环。至于为什么后边打印非常的的数是因为0 - 1回向前借位,然后二进制变成11111111 11111111 11111111 11111111,即4294967295。结果:打印完9 8 7 6 5 4 3 2 1 0 后死循环。

2023-10-16 10:55:22 119

原创 【C语言易错】不能用 ^ 计算次方??

在C语言中,^ 是一个位操作符——按位抑或,而非次方。格式:pow(操作数 , 次方 )1的2次方等于3,显然错了!

2023-10-15 19:08:49 1192

原创 【C语言疑难杂症】“无法启动程序......系统找不到指定的文件”

还有一种原因,就是新建源文件时,新建项的后缀写的是.cpp,这样这个文件可能不会自动存放到项目所在的目录,造成上述问题。这种情况我们只需要删除原来的源文件,然后新建一个并且将后缀改成 .c 即可。项目——>项目属性——>属性配置——>链接器——>常规——>输出文件——>编辑。项目——>项目属性——>配置属性——>常规——>输出目录——>编辑。创建的项目和源文件的路径不同(两者在不同的地方)查看两者的目录,然后把源文件移动到项目目录。

2023-10-08 15:03:30 16869 8

原创 浅析原码反码补码

进制表示法中,一个数的每一位都有着不同的权重,例如十进制中每一位的权重都是10的次幂,对应图中的10º、10¹、10²,我们将每一位上的数字乘以这个位置对应的权重,然后全部相加,就能得到这个数对应进制的表示形式。与十进制相同,二进制每一位的权重就是2的次幂,用每一位上的数字乘以对应权重然后全部相加就能得到这个数的二进制表达形式了。

2023-10-06 04:17:33 596 1

原创 【C语言错题笔记】

2、-128存入a中发生截断,变为10000000。打印时,发生整形提升,由于char是有符号型,补充原符号位,变成111111111111111111111111100000000(补码),由于打印类型是%u,此时编译器认为这是一个无符号数,那么补码反码原码相同,直接输出,转化为十进制为4294967168。3、补位时,看原来的类型(有符号char),不要被%u影响以为补充0。%u在最终的打印阶段发挥作用。1、%u意思是打印十进制无符号整数。

2023-10-04 17:53:15 163 1

原创 【C语言疑难杂症】b = a++;根据运算符优先级,不应该先自增然后赋值给b吗??

对于表达式 b = a++,根据运算符的优先级,的确先执行自增运算符++,但它是后置的++,也就是作用时先让表达式 a++ 产生一个结果,然后变量a再自增。综上,++的执行次序在=之前,但是赋值时采用的是表达式a++的返回值,而a++的返回值是a的旧值还是自增后的值取决于++是后置的还是前置的。然后再执行赋值运算符,将表达式a++的返回值(a的旧值,刚刚产生的结果)赋给变量b。答:先执行++不等于先自增!

2023-10-04 17:31:00 706 1

原创 【C语言错题笔记】

请问a,b,c的输出结果分别是什么

2023-10-04 17:11:59 150 1

原创 【C语言妙操作】利用 ^ 和 & 求一个数二进制位中1的个数

根据按位与的规则我们知道,对应位存在0则结果为0,均为1结果才为1。由于1除了最后一位均为0,那么它按位与一个数时,可以让这个数除了最后一位都变成0。再看最后一位,如果为1,那么结果为1,为0则结果为0。利用这个特性,我们可以将作用后的结果的最后一位数剥离,如果是0那么它的前身是1,如果是1,那么它的前身是0。如果最终结果为1,那么作用数的最后一位为1,结果为0那么作用数的最后一位为0。2、 1按位与一个数,可以让这个数二进制位最后一位不变,其他位均变成0。

2023-10-04 10:03:22 127 1

原创 【C语言】指针大小与指针类型无关?

电脑操作系统分为32位和64位,其中32位操作系统有32根地址线,因此它的地址是一个由32个二进制位组成的数字,最多有2^32中情况,也就是32位操作系统最多有2^32个内存地址;同理,64位操作系统最多有2^64个内存地址,可以访问的内存更大,运行速率也就随之更快。电脑中的内存被划分为许多个小的内存单元,每个单元都有一个二进制编号,这个编号就是这个内存单元的地址,也就是指针。32位操作系统的内存地址编号有32个二进制位(比特位),因此32位操作系统的指针大小为4个(32/8)字节;

2023-09-29 10:32:30 297

原创 【C语言易错】直接用一个数组对另一个数组进行赋值

数组名的本质是首元素的地址,地址,地址!也就是说arr1和arr2是两个数字,因此图中的“装填操作”大错特错。图中的操作试图将数组arr2中的内容直接装填进数组arr1,这么做是错误的。利用循环语句对两个数组中的元素进行一一调换。

2023-09-27 13:51:57 1059 1

原创 【C语言妙操作】循环里的迭代

使用场景:循环计算并将结果迭代至一个变量中。+= :先和对象相加,再将结果赋值给自己。例:计算1+2+3+...+10。让这个变量既参加运算又接受结果。运用符合操作符可以简化这一过程。

2023-08-23 22:30:58 166

原创 【C语言妙操作】利用 % 和 / 对多位数(整数)实现位数分离

1234%10的意思是对10取模,即取1234除以10得到的余数。1234/10的意思是取1234除以10的商。2、利用 / 得到十位及以上的位数。

2023-08-23 21:59:31 2062

原创 【C语言疑难杂症】VS2022 报错LNK1168 无法打开 filename(项目名称) 进行写入

然后将其关闭即可。

2023-08-18 21:24:27 1489 2

原创 【C语言疑难杂症】sizeof与函数strlen的区别

sizeof计算字符个数的方法是先计算出整个字符串的字节大小,然后除以单个字符的字节大小得到字符个数。此时结束标志字符 '\n' 也会计算在内,因此用最终结果减去一才是字符串中的字符个数。strlen从字符串中的第一个字符开始读取,遇见字符串结束标志 ’\n’ 时,停止读取(结束标志‘\n’不会读取)1.类型:sizeof是操作符;strlen是库函数,需要引入头文件。2.功能:sizeof用于计算对象所占内存字节数;strlen用于计算字符串中的字符个数。

2023-08-17 12:08:42 106 1

空空如也

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

TA关注的人

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