
算法专栏
本专栏记录博主自己刷算法的时候一些思路,做最平民的算法,写最平民的题解
若呓
一个致力于分布式数据库内核的小白,最近在钻研算法和扩展知识广度,暂时随手博客更新于此,希望能帮助到你,也希望大家和我一起交流。
展开
-
1.装满杯子需要的最短总时长
但是在语言环境中是默认取整的,所以可以通用为(amount[0] + amount[1] + amount[2] + 1)/ 2次,忽略奇偶场景。如果amount[0] + amount[1]原创 2023-10-08 17:58:42 · 111 阅读 · 0 评论 -
2.寻找文件副本
首先最容易想到的就是哈希表,这里由于还是文本id,所以这里的document的id也不是肆无忌惮的写的,所以哈希表的最大长度为len(documents),当找到哈希表中某个索引的值已经改变过就可以直接返回索引值。从第一个索引开始,如果第一个索引不是0,就找document[document[0]]对应的值进行交换(注意:这里的document[document[0]]如果和document[0]的值相等就可以返回)交换后如果document[0]等于0就开始判断下一个索引1的值,同理。原创 2023-10-09 10:47:05 · 118 阅读 · 0 评论 -
3.统计桌面上的不同数字
开始时,它放在桌面上。天之后,出现在桌面上的。这是算法篇的第三篇,原创 2023-10-10 15:29:00 · 79 阅读 · 0 评论 -
4.统计一个圆中点的数目
将问题转换为n个points的点到圆心(querties[0],querties[1])的距离小于等于querties[2]的个数。不要被所谓的圆心迷惑,其实就是两点之间距离公式的应用,两点之间距离公式为。个点在二维平面上的坐标。,我们同样认为它在圆。原创 2023-10-11 10:57:21 · 126 阅读 · 0 评论 -
5.交替数字和
符号集合为+ - + - + - 从后往前做可能会变成- + - + - + 得出的结果会相差一个负号。符号集合为 - + - + - 从后往前做可能会变成 + - + - + 得出的结果还是相差一个负号。这个方法最容易想到,给每个数拆开放到数组里,然后按照题说的逻辑去遍历,构成最终结果值。但是如果从数学角度看这道题也能发现一定的规律,如果我从末尾开始往前算会怎么样?看来和奇偶无关,亘古不变相差一个负号。显然,上述方法不是最聪明的,但是是最能解决问题的。返回所有数字及其对应符号的和。这是第五篇算法题,原。原创 2023-10-12 10:40:27 · 62 阅读 · 0 评论 -
6.回文数
这个方法也很容易想到,从两边各取一个指针,往中间靠拢,但是这个思路需要把原有数字先拆开,这个复杂度远不如模拟法,因此这里不做讲解。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。是一个回文整数,返回。原创 2023-10-13 17:06:12 · 49 阅读 · 0 评论 -
8.找出中枢整数
6 是中枢整数,因为 1 + 2 + 3 + 4 + 5 + 6 = 6 + 7 + 8 = 21。显然,暴力法模拟可以解决问题,相比于暴力法会有一个优化的解法。构建一个哈希表记录所有前X项的和,然后选出符合预期的值。题目保证对于给定的输入,至多存在一个中枢整数。1 是中枢整数,因为 1 = 1。可以证明不存在满足题目要求的整数。如果不存在中枢整数,则返回。设中枢数为n,中枢数满足。,找出满足下述条件的。方法一:哈希表暴力法。原创 2023-10-17 11:27:15 · 74 阅读 · 0 评论 -
7.序列中不同最大公约数的数目
如果取到一个1~max(nums)的值3,其倍数的3、6、9、12,在哈希表中对应的值为6、9,查找到9这个值的时候将上次一次寄存的6做最大公约数运算,算出来的3记为最大公约数的解,结果+1。本质是一个序列,可以通过删除数组中的某些元素(或者不删除)得到。不同的最大公约数为 6 、10 、3 、2 和 1。也可以推出最大公约数 会在每一个公约数的倍数中产生。定义为序列中所有整数的共有约数中的最大整数。给你一个由正整数组成的数组。原创 2023-10-16 15:03:40 · 145 阅读 · 0 评论 -
9.有效的完全平方数
二分法的解法一直很神奇,从两边各选一个指针往中间靠拢,中间的mid即为预设的x,根据mid*mid的大小来更改左右指针的位置,找不到符合mid返回false。这个想法并不难想,从1到num之间遍历所有数,当然,基本在num/2之前那个数就找到了。是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。不能使用任何内置的库函数,如。是一个完全平方数,则返回。原创 2023-10-18 14:05:30 · 74 阅读 · 0 评论 -
10.x 的平方根
但是有效的完全平方数只要yes or no,这里是要具体的值,注意要记录下来,而且要防止被篡改。从两端往中间找,根据mid的值判断平方根的位置。这个思路并不难想,从1开始找,找到则返回。不允许使用任何内置指数函数和算符,例如。由于返回类型是整数,结果只保留。原创 2023-10-19 10:42:05 · 78 阅读 · 0 评论 -
12.破解闯关密码
这道题可以转换一下,如果是常规的一位数的话,就是普通的排序题,把最小的数移到最高位就好,其实两位数同理,更改一下比较方式就行。这里的解题方法尝试多种排序方法。当然,还有很多种排序方法,我能力有限,欢迎大家尝试。请编写一个程序返回这个密码。原创 2023-10-23 15:12:03 · 121 阅读 · 0 评论 -
11.检查「好数组」
看到这道题的时候其实不用慌,现将问题分解一下,首先什么情况下会满足ax+by=d,这里就要引入一个新的定理,裴蜀定理,一下贴图来自。问题转换:如果存在两个互质的数就证明有解,互质的特点是两个数的最大公约数为1,如果两个数互质,那么整个数组的最大公约数就会为1。关注这里面的一句话:特别来说,方程 ax+by=1 有整数解当且仅当整数 a 和 b 互素。,你需要从中任选一些子集,然后将子集中每一个数乘以一个。这是第11个算法,是个困难题,今天来啃着个硬骨头,,那么原数组就是一个「挑选数字 5 和 7。原创 2023-10-20 11:07:24 · 73 阅读 · 0 评论 -
13.Pow(x, n)
在doPow里面有着不同的实现。这里的根本逻辑是区分奇偶,偶数场景很简单,取余后为0,则返回half*half的值,而奇数场景可能多了个x,即half*half*x。二分法有两种思路,一种是迭代,一种是递归,但是不管是迭代还是递归他们的调用逻辑都是一样的,分开处理正负的场景。那优先会想到优化方案就是二分法,分而治之来减少遍历的次数,比如。这道题最先想到的是暴力求解,但是n的取值范围是。,显然暴力一定会超时或者不是最优解。原创 2023-10-24 14:22:51 · 52 阅读 · 0 评论 -
14.设计机械累加器
注意这是一个只能进行加法操作的程序,不具备乘除、if-else、switch-case、for 循环、while 循环,及条件判断语句等高级功能。不用公式的话,既然没有判断可以考虑递归,不让用if-else 没说不让用if。请设计一个机械累加器,计算从 1、2... 一直累加到目标数值。不让用判断逻辑,可以先抖个机灵,用前n项和公式。原创 2023-10-26 10:37:37 · 131 阅读 · 0 评论 -
15.库存管理 II
与方法一同理,超过一半就会中选,那排序后的中位数一定可以当选。请返回库存表中数量大于。这道题是标准的投票问题,如果某个数得到。这是第 15 篇算法,形式记录商品库存表。原创 2023-10-27 16:50:47 · 219 阅读 · 0 评论 -
16.加密运算
请不使用四则运算符的情况下实现一个函数计算两次通信的数据量之和(三种情况均需被统计),以确保在数据传输过程中的高安全性和保密性。首先二进制实际上是没有减法运算的,所谓减法就是符号为不为 0,因此,二进制进行的都是加法运算。值得注意的是,这里当且仅当 1 + 1 = 0 发生了进位运算,进没进位可以通过与运算来判断。把进位的值左移一下,让它真的去进位,即:(dataA & dataB) << 1。把这个进位的值赋值给B,异或的结果赋值给A,再来一遍循环,知道进位的值为0为止。接着回顾一下二进制的计算规则。原创 2023-10-30 10:12:15 · 73 阅读 · 0 评论 -
17.位 1 的个数
数字1 的二进制位00000...0001,因而我们可以每次都将数字的最后一位和 1 进行与运算,如果结果为 1 则证明当前位的二进制为 1,然后可以继续去算下一位数字。n = 4294967293 (控制台输入 11111111111111111111111111111101,部分语言中 n = -3)编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为。这道题的第一反应就是去算二进制的结果,反应很对,怎么算呢。中,共有一位为 '1'。原创 2023-10-31 10:22:37 · 61 阅读 · 0 评论 -
18.撞色搭配
这道题有点像普通的那个找“单身狗”的题,那道题的做法是将数组的里的数组全部做异或运算,相同的会兑掉,但是在这道题里,有两个单身狗,做异或运算之后得到的是num1 和 num2的异或结果。注意这里的结果为 num1 和 num2异或的结果,如果二进制位为1,证明这一位上 num1 和 num2 不同,我们可以利用这个规则,找到差异位,然后根据差异位去异或出两个数字。请设计一个程序,在时间复杂度 O(n),空间复杂度O(1) 内找到这双撞色搭配袜子的两个颜色编号。[2,12] 或 [12,2]原创 2023-11-01 15:20:51 · 86 阅读 · 0 评论 -
19.动态口令
这是第 19 篇算法,从这里开始的算法优先采用模拟法,可以当作是模拟特训,某公司门禁密码使用动态口令技术。这道题很简单,就是简单的字符串移动。请返回更新后的密码字符串。原创 2023-11-02 14:53:45 · 125 阅读 · 0 评论 -
20.找出数组的串联值
这是一道标准的模拟算法,值得注意的是数组里的数字的位数是不一定的,所以不能用简单的加零相加的操作,用字符串拼接是最好的方案。接着我们从 nums 中移除这两个元素,所以 nums 变为 [52,2]。在执行任一步操作前,nums 为 [7,52,2,4] ,串联值为 0。二者的串联是 522 ,将其加到串联值上,所以串联值等于 596。二者的串联是 74 ,将其加到串联值上,所以串联值等于 74。接着我们从 nums 中移除这两个元素,所以 nums 变为空。是由这两个数值串联起来形成的新数字。原创 2023-11-03 15:07:21 · 87 阅读 · 0 评论 -
21.字母板上的路径
这里要注意有一个坑,就是z右边没有数字不能直接从VWXY直接往下走。这个问题的避免方法就是优先向上和向左,再算向下和向右就避坑了。这里主要要运用取余和除法的计算逻辑。当前的字符值除以5等于在第几行,在根据取余算法算出来在第几个。这道题看起来很恐怖,其实还好,就是标准的字符串判断题。返回指令序列,用最小的行动次数让答案和目标。(注意,字母板上只存在有字母的位置。你可以返回任何达成目标的路径。出发,该坐标对应的字符为。我们从一块字母板上的位置。原创 2023-11-06 10:18:15 · 47 阅读 · 0 评论 -
22.设计一个验证系统
/ tokenId 为 "bbb" 的验证码在时刻 15 过期,tokenId 为 "aaa" 的验证码在时刻 7 过期,所有验证码均已过期,所以返回 0。// tokenId 为 "aaa" 的验证码在时刻 7 过期,且 8 >= 7 ,所以时刻 8 的renew 操作被忽略,没有验证码被更新。// tokenId 为 "bbb" 的验证码在时刻 10 没有过期,所以 renew 操作会执行,该 token 将在时刻 15 过期。每一次验证中,用户会收到一个新的验证码,这个验证码在。原创 2023-11-07 10:47:54 · 66 阅读 · 0 评论 -
23.解密消息
分别表示一个加密密钥和一段加密消息。" 中每个字母的首次出现可以得到替换表。原创 2023-11-08 15:47:50 · 56 阅读 · 0 评论 -
24.统计星号
同时,第三条和第四条竖线 '|' 之间的字符也不计入答案。不在竖线对之间总共有 2 个星号,所以我们返回 2。不在竖线对之间的字符加粗加斜体后,得到字符串:"第一和第二条竖线 '|' 之间的字符不计入答案。换言之,第一个和第二个。为一对,第三个和第四个。原创 2023-11-09 10:28:37 · 67 阅读 · 0 评论 -
25.强密码检验器 II
其实这道题对比的是 ASCII 码,它们的字符分别是a~z,A~Z,0~9,思路是设置四个 flag,并且遍历一遍,没有异常就正确。这个算法题还挺有用的,普通的密码校验码也是这套逻辑。如果一个密码满足以下所有条件,我们称它是一个。密码满足所有的要求,所以我们返回 true。这是第 25 篇算法,原创 2023-11-10 10:50:57 · 81 阅读 · 0 评论 -
26.罗马数字转整数
这道题也是标准的模拟方法,首先无无容置疑,先把这些字母打表记录数值。然后看一下规律,如果小的字母在大的字母旁边,那么为result + (大字母 - 小字母),如果小的字母与右边字母相等或者小于右边字母,则进行加法。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。同样地,数字 9 表示为。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做。给定一个罗马数字,将其转换成整数。,即为两个并列的 1。原创 2023-11-13 11:59:02 · 61 阅读 · 0 评论 -
27.判断一个数的数字计数是否等于数位的值
先翻译一下题目,这个字符串的每一位其实指的是0~n的出现次数,例如12即0出现1次,1出现两次。所以其实这道题很简单,先遍历一遍数组统计个数,然后遍历字符串校验个数就好。数字 0 在 num 中出现了一次。数字 1 在 num 中出现了两次。数字 2 在 num 中出现了一次。数字 3 在 num 中出现了零次。"1210" 满足题目要求条件,所以返回 true。原创 2023-11-14 10:57:07 · 53 阅读 · 0 评论 -
28. 统计各位数字之和为偶数的整数个数
2、4、6、8、11、13、15、17、19、20、22、24、26 和 28。只有 2 和 4 满足小于等于 4 且各位数字之和为偶数。是其所有位上的对应数字相加的结果。原创 2023-11-15 10:33:05 · 185 阅读 · 0 评论 -
29.文物朝代判断
位文物的所属朝代编号。其中,编号为 0 的朝代表示未知朝代。请判断并返回这排文物的所属朝代编号是否连续(如遇未知朝代可算作连续情况)。展览馆展出来自 13 个朝代的文物,每排展柜展出 5 个文物。某排文物的摆放情况记录于数组。这是第29篇算法,这篇以后模拟算法就告一段落了,即将开始查找的篇章,翻译一下,就是0代表万能牌,将万能牌算上后,看看能否凑成顺子。原创 2023-11-16 14:55:47 · 103 阅读 · 0 评论 -
30.寻找旋转排序数组中的最小值 II
根据题意,所谓旋转并不破坏原数组顺序,所以即使旋转后,无非会变成两段递增的数组拼接罢了。也就是说,如果暴力求解的话,记录两段递增数组中的第一个元素,比较后返回即可。先看左指针,如果mid比较小,左指针会右移。如果跳转到第二个数组并不影响,只是left会骤减一下,继续右移。当然,查找一般都可以用到二分法,这可能会有疑问,原数组不是连续递增的,可以做二分法吗。,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的。在看右指针,如果mid比较大,同理。的数组,预先按照升序排列,经由。原创 2023-11-17 11:14:50 · 77 阅读 · 0 评论 -
31.库存管理 I
当然,肯定给大家展示的肯定不能是暴力法,这种方法没什么直接学习价值,可以尝试一下二分查找,但是这时候会有疑问了,二分查找找的不是有序数组吗。仔细看题,其实这个也是有序数组,不过是将原数组拆分后接到尾部了,每一段都是递增的,这就和上一次的算法题同理了。现因突发情况需要进行商品紧急调拨,管理员将这批商品。提前依次整理至库存表最后。请你找到并返回库存表中编号的。以便及时记录本次调拨。形式记录商品库存表。原创 2023-11-20 10:45:59 · 89 阅读 · 0 评论 -
32.搜索二维矩阵 II
当然还有一种优化方法,那就是每一行去做二分法查找,找不到就找下一行。这道题最基本的方法还是暴力查找暴力查找的话和之前的。编写一个高效的算法来搜索。原创 2023-11-21 10:32:45 · 59 阅读 · 0 评论 -
33.寻找目标值 - 二维数组
这道题其实还是二维数组搜索,与。中是否存在目标高度值。原创 2023-11-22 15:04:10 · 85 阅读 · 0 评论 -
34.点名
某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组。假定仅有一位同学缺席,请返回他的学号。原创 2023-11-23 10:22:02 · 196 阅读 · 0 评论 -
35.在排序数组中查找元素的第一个和最后一个位置
先不考虑时间复杂度的问题,可以采用双指针的方式解决问题,左右各一个指针往中间移动,直到找到数据为止。如果考虑时间复杂度,可以考虑二分法处理问题,这样的复杂度似乎满足需求。请你找出给定目标值在数组中的开始位置和结束位置。给你一个按照非递减顺序排列的整数数组。你必须设计并实现时间复杂度为。如果数组中不存在目标值。原创 2023-11-29 10:32:34 · 360 阅读 · 0 评论 -
36.统计目标成绩的出现次数
另一个思路就很神奇了,可以用二分法查找,当然二分法只等找到一个符合目标的值,我们尽量让这个值取到最左边的边界,然后循环向右找右边界。某班级考试成绩按非严格递增顺序记录于整数数组。原创 2023-11-30 10:39:46 · 500 阅读 · 0 评论 -
37.二分查找
这是最后一篇查找类型的算法,标题也是这么简单粗暴,9 出现在 nums 中并且下标为 4。,如果目标值存在返回下标,否则返回。个元素有序的(升序)整型数组。原创 2023-12-01 11:14:44 · 354 阅读 · 0 评论