- 博客(75)
- 收藏
- 关注
原创 书籍找到无锡数组中最小的k个数(8)0611
如果数组arr的长度为N,排序之后自然可以得到最小的k个数,此时间复杂度与排序时间复杂度相同,均为O(NlogN)。本题要求实现时间复杂度为O(Nlogk)和O(N)的方法。O(Nlogk)的方法,就是一直维护一个有k个数的大根堆,这个堆代表目前选出的k个最小的数,在堆里的k个元素中堆顶的元素是最小的k个数里最大的那个。在遍历完成后,堆中的k个数就是所有数组中最小的k个数。大根堆:根节点的关键字是堆里所有节点关键字中最大者,属于二叉堆的两种形式之一。的关键字值,又大于或等于右子树的关键字值。
2025-06-12 09:23:01
64
原创 书籍“之“字形打印矩阵(8)0609
1.上坐标(tR,tC)初始为(0,0),先沿着矩阵第一行移动(tC++),当到达第一行最右边的元素后,再沿着矩阵最后一列移动(tR++)。2.下坐标(dR,dC)初始为(0,0),先沿着矩阵第一列移动(dR++),当到达第一列最下边的元素时,再沿着矩阵最后一行移动(dC++)。3.上坐标与下坐标同步移动,每次移动后的上坐标与下坐标的连线就是矩阵中的一条斜线,打印斜线上的元素即可。”之“字形打印的结果为:1,2,5,9,6,3,4,7,10,11,8,12。
2025-06-09 09:25:18
319
原创 书籍将正方形矩阵顺时针转动90°(8)0605
在这个外围圈中,1,4,16,13为一组,然后让1占据4的位置,4占据16的位置,16占据13的位置,13占据1的位置,一组就调整完了。然后2,8,15,9一组,继续占据调整的过程,最后3,12,14,5为一组,继续占据调整的过程。然后(tR,tC)=(0,0)、(dR,dC)=(3,3)的子矩阵外层就调整完毕。比如,题目中的矩阵,当(tR,tC)=(0,0)、(dR,dC)=(3,3)时,表示的子矩阵就是整个矩阵,那么这个子矩阵最外层的部分如下。额外空间复杂度为O(1)。
2025-06-05 09:56:25
547
原创 书籍转圈打印矩阵(8)0604
如果能把这个子矩阵的外层转圈打印出来,那么在(tR,tC)=(0,0)、(dR,dC)=(3,3)时,打印的结果为:1,2,3,4,8,12,16,15,14,13,9,5。再把这个子矩阵转圈打印出来,结果为:6,7,11,10。把tR和tC加1,即(tR,tC)=(2,2),令dR和dC减1,即(dR,dC)=(1,1)。打印结果为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。给定一个整型矩阵matrix,请按照转圈的方式打印它。额外空间复杂度为O(1)
2025-06-04 09:40:16
315
原创 书籍在其他数都出现k次的数组中找到只出现一次的数(7)0603
首先设置一个变量eO,它是一个32位的k进制数,且每个位置上都是0。然后遍历arr,把遍历到的每一个整数都转换为k进制数,然后与eO进行无进位相加。因为k个相同的k进制数无进位相加,结果一定是每一位上都是0的k进制数,所以只出现一次的那个数最终就会剩下来。k进制的两个数c和d,在i位上无进位相加的结果就是(c(i) + d(i) )% k。那么,如果k个相同的k进制进行无进位相加,相加的结果一定是没一位上都是0的k进制数。已知arr中只有1个数出现了1次,其他的数都出现了k次,请返回只出现了1次的数。
2025-06-03 14:39:56
217
原创 书籍在其他数都出现偶数次的数组中找到出现奇数次的数(7)0530
所以,如果数组中有两个出现了奇数次的数,最终的eO一定不等一0。在这次遍历时,eOhasOne只与第k位上是1的整数异或,其他的数忽略。那么在第二次遍历结束后,eOhasOne就是a或者b中的一个,而eO^eOhasOne就是另一个出现奇数次的数。整数n与0异或的结果是n,整数n与整数n异或的结果是0。在遍历数组的过程中,把eO和每个数异或(eO=eO^当前数),最后eO的值就是出现了奇数次数的那个数。给定一个整型数组arr,其中只有一个数出现了奇数次,其他的数都出现了偶数次,打印这个数。
2025-05-30 09:09:28
226
原创 书籍整数的二进制表达中有多少个1(7)0529
在同时进行的前提下,可以将计算的过程分解成小部分,之后以并发方式来加以解决,或指用多台处理机联合求解问题的方法和步骤,其执行过程是将给定的问题首先分解成若干个尽量相互独立的子问 题,然后使用多台计算机同时求解它,从而最终求得原问题的解。平行算法,将32位分别分成5组,分别为2为一组(一个0,一个1),4位一组(2个0,2个1),8位一组(4个0,4个1)……给定一个32位整数n,可为0,可为正,可为负,返回该整数二进制表达中1的个数。上面的方法需要循环32次,下面看循环次数只与1的个数有关的解法。
2025-05-29 09:34:36
185
原创 书籍只用位运算不用算术运算实现整数的加减乘除运算(7)0528
如果不再考虑进位的情况下,a^b就是正确结果,因为0加0位0(0&0),0加1为1(0&1),1加0为1(1&0),1加1为0(1&1)实现a-b只要实现a+(-b)即可,根据二进制数在机器中的表达规则,得到一个数的相反数,就是这个数的二进制数表达取反加1(补码)的结果。在只算进位的情况下,也就是只考虑a和b的过程中进位产生的值是什么,结果就是(a&b)<<1,因为在第i位上只有1与1相加才会产生i+1位的进位。5、计算(a-(c*b)/b)的结果,记为rest,意义是修正值,即-5/5=-1。
2025-05-28 10:02:32
251
原创 书籍不用任何比较判断找出两个数中较大的数
sign函数的功能是返回整数n的符号,正数和0返回1,负数则返回0。flip函数的功能是如果n为1,返回0,如果n为0,返回1。所以,如果a-b的结果为0或正数,那么scA为1,scB为0;如果a-b的值为负数,那么scA为0,scB为1。,就是根据a-b的值的状况,选择要么返回a,要么返回b。符号右移(>>):二进制向右移,保留符号位,高位补符号位(整数补0,负数补1),相当与除以2的n次方。但方法是有局限性的,那就是如果a-b的值出现溢出,返回结果就不正确。异或运算(^):相同为0,不同为1。
2025-05-26 09:40:55
150
原创 书籍一致性哈希算法的基本原理
首先把该数据的id用哈希函数算出哈希值,并射到环中的相应位置,然后顺时针找寻离这个位置最近的机器,那么机器就是该数据的归属。题目中描述的缓存策略的潜在问题是如果增加或删除机器时(N变化)代价会很高,所有的数据都不得不根据id重新计算一遍哈希值,并将哈希值对新的机器数进行取模操作,然后进行大规模的数据迁移。2、如果目前机器有N台,则计算key%N的值,这个值就是该数据所属的机器编号,无论是添加、删除还是查询操作,都只在这台机器上进行。工程师常使用服务器集群来设计和实现数据缓存,以下是常见的策略。
2025-05-21 10:31:49
167
原创 书籍40亿非负整数中找到出现两次的数和所有数的中位数
怎么使用这个bitArr数组呢?遍历这40亿个无符号数,如果初次遇到num,就把bitArr[num*2 + 1]和bitArr[num*2]设置为01,如果第二次遇到num,就把bitArr[num*2 + 1]和bitArr[num*2]设置为10,如果第三次遇到num,就把bitArr[num*2 + 1]和bitArr[num*2]设置为11。遍历完成后,再次遍历bitArr,如果发现bitArr[i*2 + 1]和bitArr[i*2]设置为10,那么i就是出现了两次的数。
2025-05-19 16:15:19
209
原创 书籍布隆过滤器优点说明
哈希函数的输入域可以是非常大的范围,比如,任意一个字符串,但是输出域是固定的范围。布隆过滤器的优势就在于使用很少的空间就可以将准确率做到很高的程度。
2025-04-30 15:37:18
118
原创 字典树(前缀树)的实现(5)0423
先调用search(word),看word再不在Trie树中,若在,则执行后面的过程,若不在,则直接返回,从左到右遍历word中的每个字符,并依次从头节点开始根据每一个word[i]找到下一个的节点,在找的过程中,把扫过每一个节点的path值减1。4、一直向下搜索,如果单词搜索完后,找到的最后一个节点是一个终止节点,说明字典树中含有这个单词,如果找到的最后一个节点不是一个终止节点,说明单词不是字典树中添加过的单词。和查找操作同理,根据pre不断找到节点,假设最后的节点记为e,返回e.path的值即可。
2025-04-23 15:31:01
465
原创 书籍字符串匹配问题(5)0409
如果exp[i..elen-1]="A*B*",也能匹配""。所以如果把递归函数p在所有不通参数(si和ei)的情况下的所有返回值看作一个范围,这个范围就是一个(slen+1)*(elen+1)的二维数组,并且p(si,ei)代表p(i,j)的返回值,dp[i][j]就是只依赖dp(si+1,ei+1)或者p(si+k(k>=0),ei+2),假设二维数组dp[i][j]代表p(i,j)的返回值,dp[i][j]就只是依赖dp[i+1][j+1]或者dp[i+k(k>0)][j+2]的值。
2025-04-10 15:53:15
532
原创 书籍回文最少分割数(5)0402
1、假设J位置处在i与len-1位置之间(i<=j<len),如果str[i...j]是回文串,那么dp[i]的值可能是dp[j+1]+1,其含义是在str[i...len-1]上,既然str[i..j]是一个回文串,那么它可以自己作为一个分割的部分,剩下的部分(即str[j+1..len-1])继续做最经济的切割,而dp[j+1]值的含义正好是str[j+1...len-1]的最少回文分割数。所以对dp[i][j]来说,p[i+1][j-1]值一定已经计算过,这就使判断一个子串是否变得极为方便。
2025-04-02 16:19:02
206
原创 书籍最小包含子串的长度(5)0328
3、接下来是遍历过程,这个遍历过程right先进行右移动,当不在欠str2的时候,right停止,记录下标,在遍历的过程中,所有的字符都需要加入到map中。3)match:表示对所有的字符来说,str[left...right]目前一共欠str2多少个,对本例来说,初始时,match=3,即开始时欠1个'a',1个'c'和1个'b'。1)left:遍历str1的过程中,str[left...right]表示被框住的子串,所以left表示这个子串的左边界,初始时,left=0;最小包含子串不存在,返回0。
2025-03-28 09:39:31
212
原创 书籍找到被指得新类型字符(5)0327
如果uNum为奇数,str[k-1...k]是被指中的新类型字符,见例子1.如果uNum为偶数且str[k]是大写字母,str[k...k+1]是被指中的新类型字符,见例子2。如果uNum为偶数且str[k]是小写字母,str[k]是被指中的新类型字符,见例子3。然后发现str[7]是大写字母'E',所以被指中的新类型字符一定是"EC",返回即可。现在给定一个字符串str,str一定是若干新类型字符正确组合的结果,比如“eaCCBi”,由新类型字符“e”、“a”、“CC”和“Bi”拼成。
2025-03-27 10:58:28
236
原创 书籍找到字符串的最长无重复字符子串(5)0326
所以以str[i]结尾的最长无重复子串向左扩到pre位置也必然会停止,而且str[pre+1..i-1]这一段上肯定不含有str[i],所以以str[i]结尾的最长无重复字符子串就是str[pre+1..i]。想要求以str[i]结尾的最长无重复子串,a位置必然不能包含进来,因为str[a]等于str[i]。3、根据pre的定义,pre+1表示在必须以str[i-1]字符结尾的情况下,最长无重复字符子串的开始位置,也就是说,以str[i-1]结尾的最长无重复子串是向左扩到pre位置停止的。
2025-03-26 10:14:28
293
原创 书籍拼接所有字符串中产生字典顺序最小的大写字符串(5)0325
假设有两个字符串,分别记为a和b,a和b拼起来的字符串表示魏a.b。那么如果a.b的字典顺序小于b.a,就把字符串a放在前面,否则把字符串b放在前面,每两个字符串之间都按照着个标准进行比较,以此标准排序后,再依次串起来的大写字符串就是结果。这是具有传递性的,这里面不进行证明了,有传递性之后,还要证明通过这种比较方式排序后,如果交换任意两个字符串的位置所得到的总字符串,将拥有更大的字段顺序。strs=["b","ba"],可以拼成"bba",也可以拼成"bab",但后者的字段顺序更小,所以返回"bab"。
2025-03-25 10:09:18
156
原创 书籍0左边必有1的二进制字符串数量(5)0324
只由”0“与”1“组成,长度为3的所有字符串为:“000”,“001”,“010”,“011”,“100”,“101”,“110”,“111”。只由”0“与”1“组成,长度为2的所有字符串为:”00“,”01“,”10“,”11“。给定一个整数N,求由“0”字符与“1”字符组成的长度为N的所有字符串中,满足“0”字符的左边必有“1”字符的字符串数量。只由“0”与“1”组成,长度为1的所有字符串:"0"、”1“。i < N - 1 时,p(i) = p(i+1)+p(i+2)
2025-03-24 10:49:57
121
原创 书籍公式字符串求值20250320
比如"3*(4+5)+7",一开始遍历就进入递归过程value(str,0),在递归过程中value(str,0)中继续遍历str,当遇到字符'('时,递归过程value(str,0)又重复调用递归过程value(str,3)。既然在递归过程中遇到'('就交给下一层的递归过程处理,自己只用接收'('和')'之间的公式字符子串的结果,所以对所有的递归过程来说,可以看作计算的公式都是不含有'('和')'字符的。所以,只要想清楚如何计算一个不含有'('和')'的公式字符串,整个实现就完成了。
2025-03-20 10:24:15
301
原创 书籍括号字符串的有效性和最长有效长度(5)0317
比如,"()(())",假设遍历到最后一个字符')',通过上面的过程找到的必须以最后字符结尾的最长有效括号子串起码是"(())",但是前面还有一段"()",可以和"(())"结合在一起构成更大的有效括号子串。也就是说,str[i-dp[i-1]-1]和str[i]配成了一对,这时还应该把dp[i-dp[i-1]-2]的值加到dp[i]中,这么做表示把str[i-dp[i-1]-2]结尾的最长有效括号子串接到前面,才能得到以当前字符结尾的最长有效括号子串接到前面,才能得到以当前字符结尾得最长有效括号子串。
2025-03-14 09:49:25
326
原创 Springboot启动加载的一句话总结
首先,我们SpringBoot肯定会执行Main方法中的run方法,因为run方法会去进行IOC的初始化操作,那么我们的SpringBoot显然不会进行配置文件的初始化,而是注解初始化,接下来,就会把java配置类的对象传递进去,我们就会走到SpringBootApplication注解,那么接下来,起作用就是我们的@EnaleAutoConfiguration注解,这个注解会去加载Spring.factories以及spring-autoconfiguration-metadata.properites文
2025-03-13 14:09:57
256
1
原创 书籍添加最少字符使字符串整体都是回文字符串(5)0317
3、如果字符串str[i...j]多于两个字符,如果str[i]==str[j],那么dp[i][j] = dp[i+1][j-1].比如,如果str[i...j]为“A124521A”,str[i...j]需要添加的字符数与str[i+1...j-1](即“124521”)需要添加的字符数是相等的,因为只要能把“124521”整体变成回文串,然后再左右两头加上字符‘A’,就是str[i...j]整体变为回文串的结果。str="ABA".str本身就是回文串,不需要添加字符,所以返回"ABA".
2025-03-11 11:08:34
253
原创 AI大模型的基本流程
这篇文章主要是记录自己的问题,虽然说AI大数据模型已经出现了很久,但是一直找不到它与企业的关系,因为有ghat gpt,只要应用这个人工智能就可以了,所以思想一直没有转变过来。1、各个企业需要建立自己的AI模型,这个AI模型的建立是基于大语言模型(基础模型GHAT GPT Qianwen ollama等)。大模型也就是基础模型,但是这个模型不会回答自己企业的问题,因为这个模型在训练的时候,没有相关企业的数据信息。再构建企业AI的时候,主要的工作就是模型的微调,新模型的训练,主要是利用微调算法进行模型微调。
2024-09-29 10:03:17
449
原创 书籍数组中两个字符串的最小距离(5)0924
last2的值就是当前的str1和左边最它近的str2之间的距离。给定一个字符串数组strs,再给定两个字符串str1和str2,返回再strs中str1与str2的最小距离,如果str1和str2为null,或不在strs中,返回-1。从左到右遍历strs,用变量last1记录最近一次出现的str1的位置,用变量last2记录最近一次出现的str2的位置,如果遍历到str1,那么i。strs = ["1","3","3","3","2","3","1"] ,str1=“1”,str2=“2”,返回2。
2024-09-24 10:41:53
300
原创 书籍翻转字符串(5)0923
给定一个字符类型的数组chas和一个整数size,请把大小为size的左半区调整移到右半区,右半区整体移到左边。给定一个字符类型的数组chas,请在单词间做逆序调整,只要做到单词顺序逆序即可,对空格的位置没有特别要求。如果把chas看作字符串为”I‘m a student.",调整为“student . a I'm"。如果把chas看作字符串为“dog loves pig“,调整为”pig loves dog“。如果chas长度为N,两道题都要求时间复杂度为O(N)。额外空间复杂度为O(1)。
2024-09-23 10:59:12
278
原创 书籍字符串的调整与替换(5)0914
给定一个字符类型的数组chas[],chas右半区全是空字符,左半区不含有空字符。现在想将左半区中所有的空格字符替换成"%20",假设chas右半区足够大,可以满足替换所需要的空间,请完成替换函数。给定一个字符类型的数组chas[],其中只含有数字字符和"*"字符。现在想把所有的"*"字符挪动到chas的左边,数字字符挪到chas的右边。如果把chas的左半区看作字符串,为"a b c",假设chas的右半区足够大。替换后,chas的左半区为"a20%b20%20%c"。
2024-09-23 10:15:40
172
原创 书籍在有序但含有空的数组中查找字符串(5)0913
给定一个字符串数组strs[],在strs中有些位置为null,但在不为null的位置上,其字符串是按照字典顺序由小到大依次出现的。strs=[null,“a”,null,"a",null,"b",null,"c"],str=null,只要str为null,就返回-1。strs=[null,“a”,null,"a",null,"b",null,"c"],str="d",返回-1。strs=[null,“a”,null,"a",null,"b",null,"c"],str="a",返回1。
2024-09-13 10:44:34
217
1
原创 书籍判断字符数组中是否所有的字符都只出现过一次(0906)
给定一个字符类型数组chas[],判断chas中是否所有的字符都只出现过一次,请根据以下不同的两种要求实现两个函数。chas=['a','b','c'],返回true,chas=['1','2','1'],返回false。2、在保证额外空间复杂度为O(1)的前提下,请实现时间复杂度尽量低的方法。1、实现时间复杂度为O(N)的方法。
2024-09-06 10:28:15
188
原创 书籍字符串的统计字符串(5)0823
给定一个字符串的统计字符串cstr,再给定一个整数index,返回cstr所代表的原始字符串上的第index个字符,例如”a_1_b_100"所代表的原始字符串上第0个字符串是’a‘,第50个字符是'b'。给定一个字符串str,返回str的统计字符串,例如“aaabbadddffc”的统计字符串为“a_3_b_2_a_1_d_3_f_2_c_1"。
2024-08-23 17:34:58
235
原创 书籍替换字符串中连续出现的制定字符串(5)0805
给定三个字符串str from和to,把str中所有from的子串全部替换成to字符串,对连续出现from的部分要求只替换成一个to字符串,返回最终的结果字符串。str = “123abc” from=“abc” to=“4567” 返回 1234567。str=“123abcabc” from=“abc” to=“X” 返回123X。str=“123” from=“abc” to=“456” 返回123。
2024-08-05 22:23:35
179
原创 书籍将整数字符串转成整数值(5)0804
给定一个字符串str,如果str符合日常书写的整数形式,并且属于32位整数的范围,返回str所代表的整数值,否则返回0。str=“023” 因为023 不符合日常的书写习惯,所以返回0。str=“2147483647” 返回2147483647。str=“2147483648” 因为溢出了,所以返回0。str=“-123” 返回-123。str=“123” 返回 123。str=“A13” 返回0。str=“0” 返回0。
2024-08-04 22:08:55
264
原创 书籍去掉字符串中连续出现k个0的子串
给定一个字符串str和一个整数k,如果str中正好有连续的k个‘0’字符出现时,把k个连续的‘0’字符去掉,返回处理后的字符串。str=“A0000B000”,k=3 返回“A0000B”str=“A00B”,k=2,返回“AB”
2024-08-04 21:51:33
217
原创 书籍判断两个字符串是否互为旋转词
比如str=“12345”,str的旋转词有“12345”,“23451”,“34512”,“45123”和“51234”。如果a和b长度不一样,那么a和b必然不互为旋转词,可以直接返回false。如果a和b长度一样,先生成一个大字符串b2,b2是两个字符串b拼在一起的结果,即String b2 = b +b。a=“1ab2”,b=“ab12” 返回false。a=“cdab”,b=“abcd” 返回true。a=“2ab1”,b=“ab12” 返回true。
2024-08-03 21:53:11
288
原创 书籍字符串中数字子串的求和(5)0801
2 如果紧贴数字子串的左侧出现字符“-”,当连续出现的数量为奇数时,则数字视为负,连续出现的数量为偶数时,则数字视为正。例如,“A-1BC--12”,其中包含数字为-1和12.1 忽略小数点字符,例如“A1.3”,其中包含两个数字1和3.给定一个字符串str,求其中全部数字串所代表的数字之和。str=“A-1B--2C--D6CE”,返回7.str=“A1CD2E33”,返回36.
2024-08-01 21:43:10
191
原创 书籍判断两个字符串是否互为变形词(5)0718
给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样且每种字符出现的次数也是一样,那么str1与str2互为变形词。请实现函数判断两个字符串是互为变形词。
2024-07-18 08:58:00
238
原创 书籍N皇后问题(4)0717
把递归过程直接设计成逐行放置皇后的方式,可以避开条件1的那些不能放置的位置。在递归计算到第i行第j列时,查看record[0..k](k<i)的值,看是否有j相等的值,若有,则说明(i,j)不能放置皇后,再看是否有|k-i| == |record[k] - j|,若有,也说明(i,j)不能放置皇后,3 如果位置(a,b)满足|a-i| == |b-j|,说明(a,b)与(i,j)处在同一条斜线上,也不能放置。如果在(i,j)位置(第i行第j列)放置了一个皇后,接下来在哪些位置不能放置皇后呢?
2024-07-17 11:17:04
174
原创 书籍数组中的最长连续序列(4)0716
然后看map中是否含有arr[i]-1,(因为map中存的值序列是连续的,所以看arr[i] - 1 和 arr[i] + 1),如果有,则说明arr[i]-1所在的连续序列可以和arr[i]合并,合并后记为A序列。利用map可以得到B序列的长度为lenB,最小值记录为leftB,最大值记为rightB,只在map中更新与leftB和rightB有关的记录,更新成(leftB,lenB)和(rightB,lenB)。子序列:子序列就是在原来序列中找出一部分组成的序列,子序列不一定来连续,相对位置还是不变。
2024-07-16 10:08:46
290
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人