- 博客(38)
- 收藏
- 关注
原创 【无标题】
性能:虽然传入一个长度为 0 的数组会触发 toArray() 方法创建一个新数组,但现代 JVM 对这种操作进行了优化,性能开销很小。传入一个长度为 0 的数组,是为了告诉 toArray() 方法:“我不确定数组的长度,请根据集合的大小自动创建一个合适长度的数组。如果传入的数组长度不够(即数组的长度小于集合的大小),则会创建一个新的数组,并将集合的元素复制到新数组中。如果传入的数组长度足够大(即数组的长度大于或等于集合的大小),则集合的元素会被复制到这个数组中。否则,会创建一个新的数组。
2025-02-20 15:05:20
718
原创 Java基础——增强for
};// 使用增强 for 遍历自定义类 for(String item : myClass) {} } }} };// 使用增强 for 遍历自定义类 for(String item : myClass) {} } }Iterator;@Override@Override@Override// 使用增强 for 遍历自定义类OneTwoThree增强for数组(基本类型数组和对象数组)。集合类(如ListSetQueue等)。
2025-02-18 03:59:35
218
原创 Java自定义异常处理简单案例
题目:邮箱格式校验需求: 编写一个程序,要求用户输入邮箱地址,并检查邮箱格式是否合法。如果格式不合法,抛出并处理自定义异常。要求:使用Scanner获取用户输入。使用正则表达式校验邮箱格式(如如果格式不合法,抛出InvalidEmailException。捕获并处理异常,输出友好的错误信息。提示:自定义异常类:InvalidEmailException。使用Pattern和Matcher进行正则匹配。如果想在mainthrowsmaintry-catch。
2025-02-13 00:44:32
419
原创 Java的String与StringBuilder例题
String类和Stringbulider类经常相互转换,比如想要反转字符串,就要把String类型转为StringBuilder类型,然后调用reverse方法,比如想要分割Stringbuilder类型的变量,要先把他转成字符串类型。反转字符串:分割字符串:拼接字符串:去除前导零:去除后导零:
2025-02-04 18:38:51
748
原创 滑动窗口例题讲解
从0开始遍历尾指针,头指针不动,sum记录当前序列的总数,直到满足题目条件(sum>target)开始往右移动头指针,以寻找题目要求的更短子序列,直到不符合要求。找到之后再移动头指针,以寻找题目要求的更短子序列,直到不符合要求。本题的不同之处就是要判断子序列何时满足条件,可以建立一个映射关系:首先对t字符频率进行统计,比如样例,t中A有1个,B有1个,C有1个,若是s中的一个子序列的A,B,C的数量分别大于等于t中A,B,C的数量时,此时的子序列就是符合要求的,可以继续进行右移头指针和进行其他操作。
2025-01-21 19:09:54
254
原创 P1226 快速幂
因为b的二进制位数最多31位,所以只需要算出a^(2^1)mod q——a^(2^32)mod q次方即可(这里mod q是由于之间保存a的高次幂会超出范围,根据模运算的性质保存取模之后的数)我们不妨建立一个数组num,num[i] 保存着 a^(2^i) mod p的值 ,然后看看b的二进制有哪些位是1,依次判断最后计算时要取num数组中的哪些项。2^15 = 2^(8)*2^(4)*2^(2)*2(1) = 2^(2^3) * 2^(2^2)*2(2^1)*2(2^0),像这样把。
2024-12-03 23:27:21
230
原创 组合问题变式——选数(dfs)
上面的代码相当于选出了索引,比如1,2,3。我们只需要把n个整数放入一个数组中即可,然后相当于选出了数组的索引,通过数组的一一映射关系相当于选出了所对应的数字。然后把这些数字相加判断是否是素数即可啦!这是从1,2,3...,n个数字中选出k个数的组合,输出组合的全部可能的代码。
2024-12-03 18:24:03
441
原创 ST表&&RMQ问题
我们发现,其实我们想要得到[x,y]的最大值,其实不需要把每一个长度的dp[i][j]都求出来,我们可以只求那些2的n次方的长度,比如[x,y]是[1,6],长度是6-1+1=6,只要我们有[1,4]和[3,6]的最大值,他们之中更大的一个就是[1,6]的最大值,于是写出这样的代码。传统的区间动态规划枚举区间的长度(1-n),保存在数组dp[i][j]中,dp[i][j]的含义是从i到j的最大值,这样输出结果时很方便,想要区间[x,y]的最大值直接输出dp[x][y]就可以了,但是,很遗憾MLE。
2024-11-07 18:47:23
213
原创 最长公共子序列
【[轻松掌握动态规划]5.最长公共子序列 LCS】https://www.bilibili.com/video/BV1ey4y1d7oD?
2024-11-07 18:08:45
251
原创 佛洛依德判环法
操作方法,还是定义快慢指针,不过不是沿着数组走。下一步走到哪取决于当前元素值,一开始从数组第一个元素2开始,对于慢指针,走到arr[2],相当于走一步,对于快指针,走到arr[arr[2]],相当于走两步。为什么会出现环,因为数组中有两个一样的元素,比如上面这个例子,两个3都会指向索引为3的位置(当然这个例子的环是一个小环,由3指向它本身)。此时把一个指针重新置于头节点,继续走,两者每次都变为走一步,最后必然在环的入口相遇。实现方法:快慢指针。快指针每次走两步,慢指针每次走一步,最后快慢指针在环上相遇。
2024-11-04 00:14:58
323
原创 洛谷P3383:线性筛素数(埃式筛和欧拉筛)
从2开始,一直到i*i<N如果当前i是素数,直接把i的倍数都给筛了(为什么从i*i开始而不是i*2开始?因为从i*i之前的都在之前的筛除过程中都被筛了)但是大家可能注意到了,类似12,36这样的数可能被多次重复筛出,这就大大浪费了时间,这也是后面要讲的欧拉筛要优化的地方。欧拉筛优于埃式筛的重要语句就是if(i%primes[j]==0)break,这一句就使得类似12,36这类数字免于多次被筛,当然还有很多细节,比如使用pri[primes[j]*i]来标记合数,这也使得一些数字免于被重复筛除。
2024-11-02 21:44:34
430
原创 C++语法碎碎念1
可以显著减少空间复杂度,因为每个元素只占 1 位(bit)而不是 1 字节(byte),从而在存储大量布尔值时更节省内存。数组的 C++ STL 容器,用于有效地存储和操作二进制数据。2.作为函数返回值时,函数可以作为左值。用于标记一些状态,可以用。替代这个数组以节省空间。假设我们有一个布尔数组。
2024-11-02 19:20:23
282
原创 洛谷二分题单2
特别的若是最后两块石头的间距小于value,这个时候移走的是now石块,因为终点石头不可移动。对于二分查找函数如果这个值满足,就继续在这个值的右边搜寻,假设某时刻的mid就是满足结果的最大值,再大就不行了,按照代码,这个时候还是会left = mid + 1,这个时候的区间中再也没有符合的值了,最终left和right就会落在结果最大值的右边一位的地方,因此最后return的是left - 1而不是left。比如1,2,3,3,3,要找出最后一个3,该函数不能返回正确的索引,而是返回倒数第二个3的索引,
2024-10-25 18:38:22
847
原创 洛谷二分法题单
我这里其实等于的话也进行left = mid +1,(假设我们把这个时候的mid+1称为temp),继续二分查找右边,但是可以预见右边是根本查不到的,所以直接是导致left和right都指向temp,temp是刚好不满足的第一个元素,所以return的是temp-1,也就是代码中的left-1。转换成A=B+C的个数,转换成对于每个B都要找有没有满足的A,只能时扫描一遍数组,对于每个B(num[i]),在i+1到n二分查找A,因为二分首先要排序,A肯定大于B,所以只能出现在B的右边啦。
2024-10-19 17:32:02
456
原创 单调队列例题
规则就是:如果当前元素大于队尾,直接入队,否则弹出队尾元素继续比较当前元素和队尾元素,直到当前元素大于队尾元素或者队列空,入队当前元素。这里要注意进入队列的并不是实际的7,8,1,4,3,2,而是他们的索引,因为通过索引可以得到对于的数,所以接下来的模拟就用7,8,1,4,3,2。单调队列模板题,单调队列就是一个数据结构,可以维持队列中元素的单调性,一般用于求一段固定长区间里的最大(单调减)最小(单调增)值。然后扫描到1,1小于8,弹出8,继续和队尾7比较,1小于7,弹出7,队空,入队1。
2024-10-13 17:29:08
275
原创 单调栈例题
题目搞得很深奥,其实就是给我们一个数组,让我们求数组中(假设定义为num数组)每个元素右边第一个比它大的元素的下标,我们可以把答案保存再一个新的数组res中,res[i]表示num数组中第i个元素右边第一个比它大的元素的下标。那res的数组怎么记录呢(别忘了res数组的含义),我们知道2的右边第一个比他大的元素就是3,但是我们不知道2在num中的索引,那怎么给res数组相应索引的位置赋值呢,(好好理解一下这里)所以,我们实际入栈的,不是。1)求右边第一个比它大的元素:从左往右扫描,维持栈的单调递减。
2024-10-13 17:03:16
398
原创 Verilog实现四位有符号比较器
如果可以使用<和>就好了,直接把输入A和B设定为有符号类型,然后比较大小就完事了,但是由于不能使用这两者,所以只能一位一位比了。先比较最高位,如果最高位不同,进行利用与运算(具体实现请看代码)判断谁是正数谁是负数,就可以比较出大小了。否则继续比较下一位(这时的首位已经相同了),首先判断这一位是否不相同。当然,比较这一位的时候要看是正数还是负数,如果是正数的话,当然是这一位是1的那个数比是0的那个数要大;如果是负数其实还是是1的那个数更大(具体请了解补码的知识),以此类推。如果所有位都相同,说明两者相等。
2024-10-11 19:00:58
519
原创 verilog状态机题的多种写法
题目中最最最关键的一句话就是:每个时钟上升沿,状态机从coin中读入一个2位的二进制数字。需要在此时判断顾客是否可以获得饮料,以及售货机是否应当退还相应的钱。说明在投入的总钱数钱上加上当前投入的钱大于大于2元时,就要把drink置1,并且back返回找0值。有点像米勒状态机,因为相当于是在输入改变的时候输出改变。本人一开始就是因为没有仔细看题目,错误想法如下:sum记录总钱数,当sum大于等于两元时,才把drink置1,才去计算back。呜呜.......。
2024-10-10 21:51:08
1243
原创 忽略Verilog顺序和并行可能导致的延迟赋值错误
也可以采取利用二进制数直接根据公式转为对应的格雷码,格雷码的最高位就是对应二进制的最高位,格雷码除了最高位的其他位都是对应二进制的这一位和上一位的异或,比如求二进制数110对应的格雷码,最高位和110一样是1,次高位是二进制数的次高位和最高位的异或(1^1=0),最低位是二进制数最低位和次高位的异或(1^0=1),所以格雷码是101。1、在always块与块之间是并行的,always块与initial块之间是并行的。2、always块如果是用非阻塞(<=)是并行的;这道题最好的方法是用标准的状态机写法。
2024-10-06 20:58:02
509
原创 动态规划浅谈2——交替数列问题
第i个数字的最长交替子序列长度。特别注意一开始必须给dp数组最后元素赋初值1(甚至可以全部赋值为1),因为如果最后一个元素的最长交替子序列就是它本身,即1(这一步很关键,在这里最后一个元素是动态规划的起点),然后从倒数第二个元素开始计算每个元素的最长交替子序列。假设我们知道数组的第k个数字的最大交替序列,那么只需要比较第k-1个数字和第k个数字是否符号相反就可以算出第k-1个数字的最长交替子序列,如果相反就是第k个数字的最长交替子序列+1,否则就是1.
2024-10-05 21:11:11
342
原创 2024北航计组P0
1.设计四位模二除法器:模块中输入四位被除数和四位除数,输出是三位余数。如果被除数的最高位是0结果就输出被除数本身,否则输出被除数和除数按位异或之后的结果(模二除法余数),这里可以通过最高位和mux来选择结果。按位异或就是用分线器将被除数和除数分开,搞三个异或门就行,被除数和除数的最高位不需要异或,因为如果要进行按位异或,最高位一定是1^1=0,而且结果中的余数本身就是后面三位按位异或的结果(我这该死的表达,感觉没讲清楚,劳烦大家仔细体会2.搭建CRC。
2024-09-26 20:52:21
831
原创 lake counting(dfs版)——最大连通块问题
不同与一般的dfs本题是求最大连通块(而不是路径之类的),因此标记之后不需要回溯,请看代码:另外,dfs的一般模板:洛谷P1238 走迷宫(dfs)这个代码在求最大连通块时非常好用,大家可以收藏起来以备不时之需
2024-09-15 13:12:40
176
原创 洛谷P1238 走迷宫(dfs)
其中pop_back必须要在遍历完所有子节点之后进行,可能有人会有疑问,不是应该每次搜索完子节点之后马上回溯吗(。是不是搜到的子节点是终点或者不合法,dfs才会进行回溯,当搜到终点时,终点压根没入栈,如果这个时候pop_back(),会导致弹出上一层节点,不合法的同理。其中回溯非常细节,大家先看代码,主要的函数有三个第一个是check函数,用于检测新的节点是否合法(包括是否越界,是否已经走过,是否能走),第二个printPath函数,用于在到达终点打印路径,第三个就是dfs函数,用于搜索所有可能的路径。
2024-09-15 12:57:45
405
原创 动态规划浅淡1(C语言)
因为dfs会递归探索从起点到终点的每一条可能路径,在最坏的情况下(没有障碍物且每次都能向下或向右移动),搜索的路径数量是指数级别的,即最多有 2^(m+n) 条路径。我们现在想求得到达坐标(i,j)的路径总数,因为机器人只能从上方的格子或者左边的格子来,因此到坐标(i,j)的路径总数应该是到达(i-1,j)和(i,j-1)的路径之和。因此,我们可以定义一个二维数组dp[][],dp[i][j]表示的就是到达坐标(i,j)的路径总数,有递推公式。为了简化代码,可以舍去数组的第一行和第一列的特殊处理。
2024-09-04 17:11:48
990
原创 静态方法与实例方法
依赖性静态方法:与类本身关联,不依赖于任何特定实例。动态方法:与特定实例关联,依赖于实例的状态。访问范围静态方法:只能访问静态成员。动态方法:可以访问静态和实例成员。调用方式静态方法:可以通过类名直接调用。动态方法:必须通过实例调用。用途静态方法:适用于那些不依赖于对象状态的操作。动态方法:适用于那些依赖于对象状态的操作。
2024-08-23 21:30:21
684
原创 java实体类
主函数中的s传给了StudentOperator中的printTotalScore直接进行相应方法操作。这种方法适用于需要在对象创建时就初始化依赖对象的情况,并且能够确保对象的状态在方法调用时是有效的。或者使用了默认的包级访问权限(没有明确的修饰符),那么在同一个包内的。类的构造器和任何相关的成员(属性和方法)是可访问的(即不是。类都可以调用这个构造器来创建。),可以在该方法中访问传入的。是在同一个包中的类。
2024-08-23 21:02:08
304
原创 洛谷P2670 扫雷游戏——方向数组的应用
这道题要注意,读取m,n之后不能直接用scanf读取字符串,必须用getchar()吃掉换行符,以及字符二维数组每一行读完之后也要用getchar()吃掉换行符。方向数组x[N],y[N],主要用于简化对每个格子周围格子的遍历。
2024-08-15 01:51:51
195
原创 前缀和的应用(洛谷p8649)
这种特殊的k倍子区间恰好可以由开头我们置的0和前缀和数组里面其他的0配对而成!我们一般把前缀和数组的第一项赋值为0.这里的数组b是记录前缀和数组中每个数字出现的次数,比如:用样例 得到的前缀和数组是{0 ,1,3,6,10,15}经过取模后变成{0,1,1,0,0,1}/2种配对方式,但计算阶乘可能会超时,上面的代码同样可以实现计算配对方式数目,大家可以自行模拟体会,在今后可以利用这种方式计算配对数目!按照一般的思路,数组里面有2个1,配对的方式只要一种,有三个0,配对的方式有这么3种。
2024-03-30 21:12:38
338
3
原创 qsort的应用(洛谷p1012)
以此作为排序的标准:比如传入cmp的两个指针解引用出来时21和23,我们不比较21和23的字典序,而是比较拼接起来的2321和2123的字典序,以此作为排序两个元素的标准。这样的操作,一般的情况和比较字典序的结果相同(比较字典序同样会把23排到21前面),对于类似43 431这样的情况呢,同样适用.我们只需要把原来的return strcmp(p1->s,p2->s)改成比较拼起来之后的字符串啦。,使得按照名字的升序排序,与之相反return strcmp(p2->name,p1->name)则是。
2024-03-28 01:20:20
407
1
原创 如何把qsort变成稳定排序
稳定排序(冒泡之类的),可以保证大小相同的元素再排序前后的相对位置不变,但是时间复杂度相对较高,写起来也比较麻烦,(特别是在不能使用本地文件的考试中)),而qsort是大家喜闻乐见的排序函数,我们只需要写一个cmp函数就行了,但是,唯一有点美中不足的是:qsort排序不稳定,这使得在某些问题时,普通的qsort就不能很好解决问题了,这时,我们可以通过结构体来使得qsort稳定。大家肯定能想到,这道题是要用结构体数组存每个人的信息的,然后对按名字的字典序排序qsort,但是注意题目里面这一段话。
2024-03-27 01:45:24
1034
原创 C语言qsort详解
/注意这里,排序的元素是n个长度为2的一维数组。3.给结构体数组排序是可以增加一个元素一开始的位置(rank)来使得排序稳定(重要)//这三句可以合并为:return (int*)e1-(int*)e2;//降序可以合并为:return (int*)e2-(int*)e1;//比如首先按照成绩降序排序,成绩相同按照姓名的字典序升序排。(2)先按第一项的升序排序,再按第二项的降序排序。//按照字符串升序排序。//先按名字升序排序,并保证排序稳定。
2024-03-26 16:38:35
412
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人