- 博客(41)
- 收藏
- 关注
原创 备战秋招c++ 【持续更新】
要使得当前i位置的花费最小,则要对比从前一层跳过来的最低花费和从前两层跳过来的。因为prev1 和 prev2 这两个变量已经记录了信息,strs遍历完的元素不会再次遍历,所以可以省去构建数组的这一步。因为下标从0开始,可以从0也可以从1开始跳,而刚站上这层楼梯时是不需要花费的,往上跳才需要支付这层的花费。2、暴力解法,先固定一个字符串str1,然后再搜索str2,计算两个字符串间的距离,并与记录的最短距离进行比较。1、确定状态表示:dp[i]表示 以i位置为结尾,从0或1下标开始到这个位置的最小花费。
2024-05-27 23:59:37 851
原创 备战秋招 c++算法训练【自用】
2、思考优化:如果用栈存储符合要求的字符,最后取出字符串时,需要再整体进行字符串逆序,才是正确的返回值。可以用string来模拟栈,因为stl中的string支持尾插尾删,且string.back()可以查看尾部元素,即相当于查看栈顶元素。4、确定去重思路:将一个数组的元素存在与否信息存入哈希表,遍历第二个数组,遍历的每一个元素都判断一次是否已经存在于原来的哈希表,a、如果存在,说明是公共元素,将这个元素放入将要返回的数组中。字母才能消除,相同不相邻,不相同但相邻的字母不行 ---- 涉及字母的匹配。
2024-05-22 22:54:37 439
原创 顺序表 -- 【基础 】
nums.size()不能放进循环判断条件中,因为nums数组每一次都在增长,所以在每一次循环时nums.size()都在变大,所以看起来把n替换成nums.size()是一样的,其实不是。因为原题目限制数组元素的大小最大为1000,而要让一个元素同时拥有原来的元素值和需要改变的元素值,就通过设置一个密码来实现(相当于先加密再解密,解密的时候用不同的方式能够实现得到原始值或者改变值)因为元素大小小于等于1000,所以%1000,元素大小不会改变,但是却可以让被加密的元素变回原来的值;为什么要加上差值呢?
2024-03-09 23:40:49 889
原创 leetcode---76. 最小覆盖子串 [C++/滑动窗口+哈希表]
哈希表hash1用来统计t字符串中字符的频次,再设置一个kinds变量,当这个字符出现频次大于0时,就表示有一个种类。check判断hash2中的出窗口字符频次是否等于hash1中的频次,如果相等,则有效字符种类。创建哈希表hash2统计窗口中的字符出现的频次,创建count变量表示窗口中字符的种类。也就是说s字符串中的字符可能有非t字符串中的字符,或者多个t字符串中的字符(即重复)check判断 hash2中这个字符的频次是否和hash1中的频次 相等。在哈希表中更新right指针指向的元素的频次。
2023-12-19 17:56:27 653
原创 leetcode --- 30. 串联所有单词的子串[C++ 滑动窗口/双指针]
因为s字符串中可能出现words字符串中没有的字符,所以在进行比较的时候,hash1会先创建出一个空间再进行比较,这样就造成一定程度的时间消耗,所以在进行比较之前加个判断,hash1.count(in)判断这个字符串是否存在,如果不存在于words中,那就没有判断的必要,不影响有效字符串个数的大小。根据题目解析中的规律,当起始的字符跳过了一个words字符串的长度,那么就会和第一种情况(从第一个字符开始的分割方式)重复,所以滑动窗口的执行次数就是words字符串长度的大小。要在s字符串中找到串联子串。
2023-12-19 16:09:19 1046 2
原创 leetcode --- 438. 找到字符串中所有字母异位词[C++/滑动窗口+哈希表]
判断 如果出窗口字符 out(最开始保存的)在hash_s中的个数要小于等于在hash_p中的个数,表示这个出窗口的字符是有效字符,有效个数count减小一个(判断条件没有大于,是因为如果是大于的话,那么这个字符本身就是多余的,在先前的入窗口中就不会增加有效个数,所以这里也就没必要减小有效个数)因为比较两个哈希表需要每一次都遍历哈希表,进一步优化,设置一个有效数count来记录哈希表hash_s中有效的字符个数,即hash_p(目标字符串的哈希表)中有的,hash_s也有时就为有效。
2023-12-19 14:38:58 729
原创 leetcode---904. 水果成篮 -- 【滑动窗口/c++】
用滑动窗口进行优化,因为当种类数超过2时,右指针其实不用回到左指针位置重新遍历,此时左右指针内的所有元素个数和就表示从左指针开始能达到的最大值(最多水果个数),这时只要左指针移动,直到哈希表中的长度等于2为止。而最多只能摘两种类型的果子,在示例1中就是,从下标0开始 有 1,2,1可以摘遍所有树;如示例1,fruit【1,2,1】就表示下标0处有1号类型的树,下标1处有2号类型的树,下标2处有1号类型的树。为判断摘的果子种类是否超过两种,用哈希表来记录摘的果子的种类。而哈希表的长度就表示含有的种类数。
2023-12-14 21:14:37 417
原创 leetcode--1004 最大连续1的个数 III[滑动窗口c++]
比如k为2 那么数组 1 1 0 0 1 1 1 1 这个数组中最长子串的长度就是8,如果是在0等于2个时就停下,那么更新的结果就会是4 还是不理解可以自己提交示例运行试试)1.进窗口--- 遇到0计数器++,否则忽略( ps:滑动窗口的进窗口操作是载入数据,而不是单纯的移动right指针,如果只移动了right而没有对数据进行处理,则不算进窗口。3.出窗口---left移动,遇到0时计数器--,直到计数器的0个数等于k个,符合题目要求为止。题目的翻转0,意思就是把0变成1;
2023-12-13 17:16:06 492
原创 leetcode--3. 无重复字符的最长子串[滑动窗口\哈希表 c++]
进窗口 --- 利用哈希表记录进入窗口的字符,即right指向的字符。因为字母有对应的ascii码值,可以转化为int类型,所以直接将字符作为哈希表的下标。判断 --- 在滑动窗口的判断阶段,若哈希表中存放的数字大于1,则说明当前right指向的字符重复。更新状态---此时right指针指向的字符的哈希表数据更新为1,表明不再重复,继续遍历。出窗口---直到left指针跳过了和right指针相同的字符。最长子串可以用滑动窗口解决,无重复字符可以使用哈希表解决。哈希表作为一个数组存放每个字符出现的次数。
2023-12-13 16:55:05 494
原创 leetcode -- 209 长度最小的子数组[滑动窗口/c++]
比如此题中,滑动窗口(双指针包围的数)内的数值和已经大于或等于目标值,此时right再++的话,len长度就更长了,题目要求返回长度最小的子数组长度,所以没有再让right++的必要,直接让left++,开始遍历下一个子数组。因为我们是在一达到题目要求(大于等于目标值)的情况下就进行调整的,也就是出窗口操作,所以也不可能存在漏解的情况。滑动窗口其实就是同向双指针,因为计算结果的单调性,在符合条件的情况下,左右指针不必往回回溯,而实现优化的效果。4.更新状态(可能在出窗口前,也可能在出窗口后,依情况而定)
2023-12-13 16:44:35 470
原创 leetcode --15 三数之和 【双指针 C++】
其实只要将三个数的其中一个数固定,而去找另两个数的和,就可以化用以前的知识了。题目中说的不可以包含重复的三元组,从示例1可以看出[-1,0,1] 和[0,1,-1]虽然三个数顺序不同但是元素重复了,所以只选取其中一个。因为固定的数也要去重,所以在用for循环时,在for后的式子中省略了最后一个调整,把调整放进了去重的操作中。而当一次双指针寻找循环结束后,固定数移动时,如果遇到了重复的数,则也要跳过。(固定数的选取的去重)找到一种符合要求的结果后,左右指针要跳过重复的数(双指针的选取的去重)
2023-12-13 16:32:43 437
原创 leetcode返回二维数组的模板[C语言]
说明: int **returnColumnSizes 是一维数组的首元素地址,这个数组存放的是要返回的二维数组的每一行的列的个数。因为返回的是二维数组,所以先malloc一个指针类型的数组,然后再在其中malloc完整的列。returnSize 是二维数组的行数。
2023-12-08 00:03:51 430
原创 leetcode--611 有效三角形的个数 【双指针 C++】
因为排序后的数组具有单调性,从左到右递增,所以当两个指针的值已经大于固定的最大值时,left再++,仍旧会使结果大于最大值。所以后续的遍历已经没有必要,此时从left到right间的数都能与right和固定的最大值组成有效三元组,而数量就等于right-left。当判断到 2+4>5 时 ,左右指针间的数都能与右指针构成有效数对,并与最大固定值组成有效三元组。一般判断有效三角形要靠三次判断a+b>c(a,b,c对应三条不同的边)a+c>b , b+c>a。对数组排序优化后,利用单调性,双指针解决。
2023-12-07 01:07:28 414
原创 贪吃蛇小游戏 --- 基于WIN32API【C语言】
本文将用win32提供的API进行贪吃蛇小游戏的开发,用C语言在Windows环境的控制台中模拟实现经典小游戏贪吃蛇。也就是说,你只要会用vs2019或者其他版本的vs即可。不用额外学习esayx等其他软件。win32的API是电脑系统自带的函数接口,通过调用相关函数,我们可以在窗口中实现贪吃蛇小游戏。
2023-12-06 16:53:49 1428
原创 leetcode--11 盛水最多的容器 【双指针C/C++】
实际上,我们是从图中的左右两端的移动 造成 的容积大小变化而 总结出 左右两端可以看成是双指针的结论。继续寻找盛水最多的容器的方法就是移动指向4的指针(或者说改变较矮的木板),即不再去遍历计算 固定4(较短板)的容器储水量大小。若移动left指向5,则right指向的4 作为较矮的那一端,根据水桶原理,其(最短板)高度就是水位的高度,所以就算在宽度减小的时候遇到更高的,其水位高度也不会变化。而上面的情况都是针对容器的两端中较矮的那一端不动进行研究的,所以继续寻找盛水最多的容器的方法就是。
2023-12-05 23:09:22 482
原创 从汇编代码看函数栈帧的创建和销毁【通俗版】
读完本文,你将知道局部变量是怎么创建的,为什么局部变量的值是随机值,函数是怎么传参的,传参的顺序是怎样的,形参和实参是什么关系,函数调用是怎样的。需要注意的是,本文用的是vs2013,函数调用过程中栈帧的创建是略有差异的,具体细节取决于编译器的实现。
2023-12-03 15:18:35 1008 1
原创 leetcode -- 202快乐数 [双指针 C/C++]
从我们刚刚的题目解析可以知道,最终结果为1的快乐数,可以看作是环上的点都是1。而不是快乐数的相遇点不是1,首先,既然能相遇,那么说明他们一定在环里,那么既然在环里,如果是快乐数,那环内的值就应该都是1,所以当相遇点非1的时候,这个数就不是快乐数。而两种情况其实可以归并为1种情况,将他们都看作在最后形成一个环,对于第一种情况,环上的数都是1,第二种则不是。只存在两种情况,一种情况是经过题目的运算后,最终结果变为1.另一种情况是经过题目运算后一直循环,即示例2的情况。定义双指针,一个慢指针一个快指针。
2023-12-03 13:02:00 367 1
原创 大端字节序和小端字节序
就像当年春秋战国时期没有大一统的时候,各国的货币,文字等等都是不同的。在c语言中,除了8bit的char型外,还有16bit的short型,32bit的int型和64bit的long型(看具体编译器,有些编译器的long是32bit)对于位数大于8位的计算器,比如16位或者32位处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多字节安排的问题,因此就有了大端存储模式和小端存储模式。3.小端字节序—— 把一个数据的高位置字节的内容,存放在低地址处,把一个数据的低位字节内容存放在高地址处。
2023-12-03 11:17:55 429 1
原创 整型在内存中的存储方式
当整型是有符号整型时,这三种表现方法均有符号位和数值位两部分。符号位 0 表示正符号位1 表示负正整数的原、反、补码相同。
2023-12-03 11:14:47 948 1
原创 leetcode -- 1089 复写零 【双指针 C/C++】
只要按照下面步骤,就能找到最后一个需要“复写”的位置。结束时,cur指向的元素就是最后一个需要“复写”的位置1.判断cur位置的值2.决定dest往前走一步还是两步3.判断dest是否到结束位置4.cur++处理边界情况当最后一个复写元素是0时,dest连续走两步会直接到n(假设n为数组元素个数)位置,发生数组越界。这时将数组的最后一个元素赋为0,然后cur向前移动一步,dest向前移动两步。eg:原 1 0 2 3 0 4。
2023-12-01 18:16:43 412 1
原创 如何将一个句子中的单词倒置
gets输入函数是在敲完回车的时候就结束读取的,我们可以看到最后一段的描述,说gets不同于fgets函数,不仅仅是因为gets从stdin(就是键盘输入),而且它不会在最终的字符串中包含结束一行的字符,也就是gets读取到的字符串中是不含‘\n’的。答案是可以的,我们将逆序字符串的功能编写成一个函数,传参使用要逆序的字符串的首字符的地址和末尾字符的地址,当逆序不同的单词时,实际上只要传不同的首元素字符地址和尾元素字符地址就可以了。而我们熟悉的是对字符串进行逆序,但这样子单词就不能保持原来的样子.
2023-06-14 23:35:42 251
原创 求最小公倍数
这里的a,b 类型设置为long long 是为了过牛客网的测试,牛客网会试很多组例子,其中包括很大的数,当a和i 都很大的时候,a*i的值就超过了int所能存储的范围。也就是说这个k需要满足 a* i == k, 且 k % b == 0 (公倍数能被a,b整除)i初始化为1,一旦不满足while中的判断时,得到的 a*i 就是最小公倍数。假设两个整数a,b,现在要求a和b的最小公倍数。即 a 和 b 各乘一个数就可以的到它们的公倍数。这个时候,需要求解的就变成了 i。假设k就是a和b的最小公倍数。
2023-06-12 23:19:58 693
原创 c语言初阶关于二进制位的三道经典例题
三种思路实现计算二进制位中1的个数。分别打印出二进制位中偶数位和奇数位。打印出两个数的二进制位有多少个不同的位数。
2023-06-10 19:14:46 516
原创 关于循环的两道经典练习
1.这两道用循环解决的题目破题关键是找到实现目标中有关循环的内容。可以对实现目标进行拆分,将其拆分为最小单元,先实现这最小单元的计算,再扩展到后续更大的计算。比如求水仙花数,先思考一个水仙花数的求取和判断方法,知道这个后再放入循环中。2.根据循环的内容,选择合适的循环语句。比如用到整型除法的循环,tmp=tmp/10 最终tmp会变成0且因为要进行多次计算,计算的次数与tmp的位数有关。所以选择while作循环语句,将tmp作为循环的进入条件,将tmp=tmp/10 来作为循环的调整。
2023-06-10 10:57:23 53
原创 计算1/1 - 1/2 + 1/3 - 1/4 + 1/5 …- 1/100
实现正负交替运算;用数学方法优化算法;整数除法和浮点数除法的区分
2023-05-27 10:49:34 301 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人