自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 第五十一天 | 1143.最长公共子序列

如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

2024-06-13 18:19:40 309

原创 Python(完结)| 图形的面积

之后我们创建了一个包含不同类型的图形对象的列表shapes,然后循环遍历该列表并调用calculate_area方法,景观调用的方法时根据对象的类型动态确定的,这其实就是多态的概念。方法设置属性,如果希望属性是只读的,则可以直接去掉setter方法,如果希望属性不能被外部访问,则可以直接去掉getter方法。,就好像,当父亲和儿子都拥有一样东西,会优先使用自己的,如果发现自己没有,才会使用继承的方法。在上面的示例代码中,图形类拥有两个属性和一个方法,圆的类在图形类的基础上添加了半径这个属性。

2024-06-08 14:52:35 296

原创 Python | 排队取奶茶

由此可见,在列表中,如果直接pop(),那么将会弹出列表的最末尾一个值;而如果pop(0),那么将会弹出列表中的第一个元素。提供了多种队列的实现,比如普通队列和优先级队列,因此你可以使用。类来创建队列,不过我们依旧可以使用列表来模拟队列的实现。在 Python 语言中,标准库中的queue。

2024-06-07 20:47:24 2191

原创 Python | 洗盘子(栈)

Python 语言确实支持栈数据结构,但它通常是通过。

2024-06-07 20:22:47 209

原创 Python | 开房门(map)

表示这是一个空字典,而并非一个空集合。创建字典,如果想要给字典添加键值对,可以直接通过。来包裹(set也是{}),每个键值对用冒号。这个视图象可以用于迭代字典中的键值对。称之为映射,就是将一个元素(通常称之为。字典的遍历需要搭配使用。方法返回了字典中的所有键值对的视图对象。键)与一个相对应的值(通常称之为。不可变的(字符串、数字、元组等), 但是值可以是任意的数据类型。分隔,键值对与键值对之间用逗号。**实现了映射这种数据结构。【注意】:如果直接创建一个。

2024-06-07 19:58:45 335

原创 Python | 判断集合成员(set作为哈希表)(集合)

还提供了一些常见方法方便使用,主要包括的就是集合的增删和遍历操作。也是一种数据结构,和数学中的集合类似,它。,并且不保证元素的顺序。查找通常是集合最重要的操作。创建集合,元素与元素之间使用逗号。创建集合,或者是列表转为集合。除了以上两种常见的操作,

2024-06-05 18:19:33 283

原创 Python | 出现频率最高的字母(数组作为哈希表)

字母一共有26个,我们可不可以定义一个长度为26的列表,列表的元素代表着各位字符的频率,初始频率都为0,列表的索引 0 对应着字符 a, 索引 1 对应着字符 b, 依次类推,索引 25 对应着 字母 z。然后遍历整个字符串,如果遇到字符 a, 则对应的 索引0 的元素值 + 1, 表示频率 + 1,当字符串遍历完毕,各个字符的频率也都统计完毕了。它的核心思想是在关键码和存储位置之间建立一个确定的对应关系。对应一个存储位置,而这个对应关系,称之为散列函数(

2024-06-05 16:01:58 196

原创 Python | 链表的基础操作||

python对缩进和符号十分敏感。

2024-06-05 15:48:09 75

原创 Python | 链表的基础操作1

人拥有着一些静态的特征,比如身高、体重、性别等,也拥有一些动态的行为,比如吃法,睡觉等,而在计算机世界中,我们将之抽象为一个类。方法会在实例创建的时候立即执行,可以向新创建的对象初始化属性,调用类创建对象时,类后边的所有参数都会依次传递到init中。需要定义一个链表类用于容纳链表节点,链表类一般包括链表头节点和链表的节点长度这两个属性。如果当前链表不为空链表,将新的节点放入到链表的尾部,接入链表,也就是当前链表的尾部的。,它定义了对象的结构和行为方式,而对象是“类”的实现。变量,将会成为所有的实例的属性。

2024-06-04 18:20:59 324

原创 Python | 位置交换(字符串、元组)

字符串转列表、swap两两交换、join()进行连接。需要注意的一点是,元组中只有一个元素时,需要在元素后面添加逗号,即。在上面的操作中,我们使用元组拆包将元组中的每个元素分别赋值给变量。Python有十分简洁的写法可以交换两个变量的值:元组解构。,然后使用元组解构("拆包")将这个元组中的值分别赋给。,这样就可以快速访问元组中的元素。这种操作实际上是将,,这样就完成了交换。

2024-06-04 15:08:18 153

原创 Python | 句子缩写

的第二个字符开始遍历到倒数第二个字符(最后一个字符肯定不是一个单词,不需要拼接)。在循环中,检查当前字符是否为空格,并且下一个字符不是空格(这是为了跳过单词之间的多个空格),如果满足条件,则说明遇到了一个新的单词,下一个字符是这个单词的首字母,然后将下一个字符经过处理后添加到。对应的 Unicode 码值是从 65 到 90, 大小写字母之间的差值为32,所以可以通过数学运算将小写字符减去32后转换为大写字符。如果实参是可变对象(例如,列表或字典),函数内的操作可能会影响到实参,这是因为在这种情况下,

2024-06-04 14:53:02 470 1

原创 Python | 平均绩点

以及空格之外的字符,则把“真令牌”替换成“假令牌”,这样当走出循环之后再进行输出处理时,就会因为不认识这个“假令牌”而不进行输出。也就是说,我们可以采用这样一种思路,事先给每一行字符串一个“真的令牌”,字符串遍历处理过程中,如果有哪一行字符串中有。开头,后面跟着字符串,字符串中的表达式用大括号 {} 包起来,它会将变量或表达式计算后的值替换进去。在Python中,整数相除会得到浮点数结果,即使结果是一个整数,也会以浮点数的形式表示。中的字符串连接成一个新的字符串,你可以指定连接符号,比如下面的示例。

2024-06-03 23:00:05 588

原创 Python | 摆平积木(列表)

包含多组测试数据时就需要使用while True。

2024-06-03 20:05:56 108

原创 Python | 倒叙输出和隔位输出(数组和列表)

列表可以包含各种不同类型的元素,包括整数、浮点数、字符串、甚至可以是其他列表,而且列表的长度是可变的,你可以根据需要向列表中添加或删除元素,从而改变列表的长度。此时列表的长度为n, 倒序输出列表,即从列表的第 n-1 位遍历到第0位,如果使用 for 循环,range 的起始位置应该是 n -1,切片是对列表的一个连续片段的引用,就好像列表从中间的某个部分到另外一个部分切了两刀,从而拿到列表的一部分。是可选参数,用于指定从起始到结束的步长,默认为1,切片获取的内容是从开头索引到结束索引(不包括结束索引)。

2024-06-03 19:55:36 406

原创 Python | A + B问题|V

和c++不同,python中的for循环永远的都是左闭右开区间,不能自己控制,所以在循环体中用变量i来索引时,要注意i的取值。还有一个问题仍存在,就是列表中的所有元素仍然是字符串,我们需要用一种快捷操作将列表中的所有元素转换成整数,这可以使用内置的。函数,它也常用于Python中的列表操作,可以将一个函数应用到序列的每个元素,并返回一个包含结果的新序列(初始值是总和的初始值,然后将列表中的元素依次相加。从列表中获取从指定索引(包括该索引)到序列末尾的所有元素。,将之转换成整数,并最终返回一个新的列表。

2024-06-02 23:24:23 306

原创 Python | A + B问题|||

continue:只能出现在for、while循环内部,用法实在执行过程中跳过当前循环迭代的剩余部分,然后进行下一次迭代。, 如果判断结果为True, 则执行语句1,并返回执行结果,如果判断结果为False, 则执行语句2,并返回执行结果。逻辑运算符:and(&&)、or(||)、not(!条件运算符在执行时,if语句:if、elif、else。

2024-06-02 22:27:58 290

原创 Python | A + B问题||

循环中,条件判断通常是一个布尔值,即true表示真,false表示假,但是假设我们给定的是一个整数类型的值,编译器会帮助我们进行数据类型转换,将之转换成布尔值,如果整数的值为0,则条件的值为false, 其他非0的数都会转换成true。2.在显式类型转换中,用户将对象的数据类型转换为所需的数据类型。我们使用 int()、float()、str()、bool() 等函数来执行显式类型转换。既然是持续性的输入,说明在循环做输入n这个操作,那我们就需要使用到上一节中使用的while。

2024-06-02 20:36:41 331

原创 Python | A + B问题|

虽然我们现在只写了几行代码,但是以后我们会面对上千甚至上万行代码,为了方便组织和管理,这些代码要分属不同的模块,就像图书馆里的书要分不同的类一样。的控制下,执行输入、计算、输出的三行代码会持续不断的运行,你输入一行数据,程序就处理一行数据,但是数据的输入是不会一直进行下去的,当输入结束时,循环也应该终止掉。中的代码会被尝试执行,如果没有发生错误,则正常执行,用户停止输入后,输入的内容不能正确地分割成两个整数,或者其他可能的错误发生,就会引起程序异常,这时就会由。而且,Python中有许多内置的模块,比如。

2024-06-02 18:46:02 377

原创 acm模式练习

就是取出每一位数并进行判断,比较简单,还是注意上面那道题说的cin时要有while循环。4.cout和printf的区别:前者自动输出换行符,后者要自己输出“\n”1.getline函数格式,直到读入一个换行符时停止,可接受一整行的换行符。需要多输出换行符,且右多组计算数据,但每大组之间又不需要换行符。为什么这个while循环是必要的?外层while循环什么时候停止?while循环什么时候停止?5.A + B问题V||6.A+ B问题V|||2.A + B问题||当n=0时,输入结束。

2024-06-01 20:02:24 432

原创 第五十天 进入子序列问题 | 300.最长递增子序列 674.最长连续递增序列 718.最长重复子数组

为什么一定表示 “以nums[i]结尾的最长递增子序” ,因为我们在 做 递增比较的时候,如果比较 nums[j] 和 nums[i] 的大小,那么两个递增子序列一定分别以nums[j]为结尾 和 nums[i]为结尾, 要不然这个比较就没有意义了,不是尾部元素的比较那么 如何算递增呢。所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);1.dp数组含义:以nums[i]为结尾的最长递增子序列的长度。以nums[i]为结尾的最长递增子序列的长度。

2024-06-01 17:46:56 181

原创 python 第一天

问题:编写一个程序,它将找到所有这些数字,可被7整除,但不是5的倍数,2000年至3200年(包括在内)。得到的数字应按逗号分隔的顺序打印在一行上。问题:使用给定的整数n,编写一个程序生成一个包含(i, i*i)的字典,该字典包含1到n之间的整数(两者都包含)。问题:编写一个可以计算给定数的阶乘的程序。结果应该以逗号分隔的顺序打印在一行上。提示:在为问题提供输入数据的情况下,应该假设它是控制台输入。提示:在为问题提供输入数据的情况下,应该假设它是控制台输入。陌生语法:把for循环套在print函数里。

2024-05-31 19:47:04 860

原创 第四十九天 | 188.买卖股票的最佳时机|V 309.最佳买卖股票时机含冷冻期 714.买卖股票的最佳时机含手续费

选最大的,所以 dp[i][1] = max(dp[i - 1][0] - prices[i], dp[i - 1][1]);所以dp[i][2] = max(dp[i - 1][1] + prices[i], dp[i - 1][2])使用二维数组 dp[i][j] :第i天的状态为j,所剩下的最大现金是dp[i][j]第0天没有操作,这个最容易想到,就是0,即:dp[0][0] = 0;第0天做第一次买入的操作,dp[0][1] = -prices[0];第二次卖出初始化dp[0][4] = 0;

2024-05-30 20:35:14 410

原创 第四十八天 |122.买股票的最佳时期|| 121.购买股票的最佳时期 123.买卖股票的最佳时期|||

如果prices[i] - prices[i - 1] > 0,那么就在第 i - 1天买,在 i - 1 天卖,dp[i] 取第i - 1天的最大值加上在第 i - 1天买,在 i - 1 天卖所获得的新利润;dp[0][0]:第一天有股票,那么利润一定是 - prices[0]

2024-05-30 13:01:27 361

原创 第四十七天 | 198.打家劫舍 213.打家劫舍|| 337.打家劫舍|||

当i = 1时,dp[1]应该为前两个房间所能偷的最大值,又因为两个房间不能一起偷,所以去前两个房间的最大值作为dp[1]。两种情况:①偷第 i 房间,也就意味着一定不能头nums[i - 1]:dp[i - 2] + nums[i]1.dp数组含义:考虑下标 i 和 i 之前的房间(dp[i] 不一定会偷第 i个房间),所能偷的最大的金币。2.动态转移方程:dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])3.初始化:递推公式的基础是dp[0] 和 dp[1]

2024-05-29 18:28:18 238

原创 汇编原理 | 二进制、跳转指令、算数运算、

JB/JNAE/JC - jump if below/not above equal/carry 低于/不高于等于/有借位。在32位bit时该怎么表示-6?-> 111...(20个1) 1101 (十进制里的13/d) 0110(十进制里的6) 0110(十进制里的6)-> 000...(20个0) 0010(十进制里的2) 1001(十进制里的9) 1010(十进制里的a)a-Above、g-Greater 当操作数1 > 操作数2 时发生跳转。-1 = 1111(由 1 + (-1) = 0 推的)

2024-05-28 21:27:06 555

原创 第四十六天 | 279.完全平方数 139.单词拆分

if([i,j] && dp[i] == true) 则 dp[j] == true;这个背包的总容量为s.size(),如果到最后背包内所装物品的数量为s.size(),就返回true,否则返回false.2.状态转移方程:dp[j] = min(dp[j], dp[j - i * i] + 1)1.dp[j]数组含义:装满容量为 j 的背包所需要的物品数为dp[j]2.动态转移方程:如果字典里有[i],dp[j] = dp[j - ] + 1;1.dp[j]含义:容量为j的背包所装物品的数目。

2024-05-28 20:37:40 361

原创 常用汇编指令

1.数据寄存器:AX(accumulator 累加器)、BX(base address 基址寄存器 “过渡寄存器”)、CX(counter 计数器)、DX(data 数据寄存器):可拆分为L和H,将16位拆分为低八位和高八位。[注]:这两个属于变址寄存器.可以和bx.bp联用,但是和bx连用时,段地址在DS中,和bp联用时,段地址在SS中.也可以单独使用,单独使用时,段地址默认在DS中,想要越段使用,加上段前缀即可.BP(base pointer):基址指针,段地址默认在SS中,可以定位物理地址。

2024-05-28 18:08:05 398

原创 汇编原理(四)[BX]和loop指令

误区:在编译器里写代码和在debug里写代码是不一样的,此时,对于编译器来说,就需要用到[bx][bx]同样表示一个内存单元,他的偏移地址在bx中,比如下面的指令。

2024-05-28 15:40:16 367

原创 关于DOS

属于单用户单任务操作系统,一次只能执行一个任务。一次只能执行一个任务。DOS操作系统是通过输入命令来执行一些操作。)的程序,表面看上去类似于Win3.x/9x中的MS-DOS窗口。然而,它们是完全不同的。WinNT/2K/XP中有个叫“命令提示符”(

2024-05-28 15:11:16 229

原创 汇编原理(三)编程

ex1:XXX segment、XXX ends这两个是一对成对使用的伪指令,且必须会被用到,其功能是定义一个段,segment表示开始,ends表示段结束。ex:codesg 放在segment的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址(ex2:end是汇编程序的结束标志。ends是段的结束,end是整个程序结束。伪指令:无对应的机器码,是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。汇编指令:有对应的机器码与其对应。一个标号指代了一个地址。

2024-05-28 11:44:12 586

原创 汇编原理(二)寄存器——内存访问

内存中字的存储:

2024-05-27 17:14:34 468

原创 汇编原理(二)寄存器——CPU工作原理

越位”会“丢弃”:“丢弃”只是指禁止为不能在8位的寄存器中保存,但是cpu不是真的丢弃这个进位值。最大存放的数据为2的16次方减1。可分为AH和AL,兼容8位寄存器。字:1word = 2Byte。二进制和八进制、十六进制的转化(0000)-(0)。AX,BX,CX,DX存放一般性数据,称为通用寄存器。寄存器:所有寄存器都是16位(0-15),可以存放两个字节。

2024-05-26 23:02:24 761 1

原创 汇编语言(一)

地址总线:地址总线上能传送多少个不同的信息,cpu就可以对多少个存储单元进行寻址(32位、64位)1Byte = 8bit。指令和数据:二进制信息是当作指令还是数据有我们说了算。存储单元: 存储器cpu被划分为若干个存储单元(从0开始编号)一个单元存8bit。控制总线:宽度决定控制能力,“命令”、“读”、“写”存储器:cpu,传入指令和数据,加以运算。寄存器:cpu中可以储存数据的器件(AX,BX)cpu对存储器的读写:地址线、数据线、控制线。数据总线:宽度决定数据传输的速度。接口:接到外部进行控制。

2024-05-26 22:38:46 244

原创 TCP/IP协议(一)

·IP地址(软件层面):如果像要给路由发送数据,那么每台电脑的地址要有一个统一的开头。但每个场上的制造网卡时自己设定每台电脑的MAC地址,如果用MAC地址来建立子网结构(因为MAC地址不可能改变,那么子网建立后,子网结构也不能轻易改变)。//理解了报文,TCP/IP协议族就为报文提供了点对点的连结机制,并且将传输数据帧的封装、寻址、传输、路由以及接收方式,都予以标准化。负责IP地址的寻找,这一功能就很自然的理解了。大致的从低到高的传输链路有印象了,接下来就是跟细化的传输数据的过程。

2024-05-26 21:48:32 655

原创 第四十五天 | 322.零钱兑换

本轮要放的物品重量为coins[i],所以背包必须腾出coins[i]这么大的容量留给coins[i],所以之前背包装的重量必须是dp[j - coins[i]]。装了coins[i]后,一共装了dp[j - coins[i]] + 1块硬币,与不装coins[i] 的情况比大小,取其小,得到本轮循环的最优解,就是本次的最少个数。其实道理和其他题目中,初始化为0的道理是一样的,其他题目如果是取其大max,则初始化为0,只要没有负数的情况,就可以保证能够更新值,不会被覆盖。放的硬币个数为dp[j];

2024-05-26 11:39:30 281

原创 第四十四天 完全背包理论 | 518.零钱兑换|| 377.组合总和|V 爬楼梯进阶版

解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4。其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"}。输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3。2.递推公式:dp[i][j] = max(dp[i][j], dp[i - x][j - y] + 1);4.遍历顺序:先字符从前到后,在背包,背包两个维度都是从后向前。

2024-05-25 09:00:32 209

原创 第四十三天 | 416.分割等和子集 1049.最后一块石头的重量|| 494.目标和 474.一和零

那么如果背包容量为target, dp[target]就是装满 背包之后的重量,所以 当 dp[target] == target 的时候,背包就装满了。2.递推公式:dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);1.dp[j]含义:背包容量为j时,最大价值为dp[j]。2.递推公式:dp[j] = max(dp[j], dp[j - nums[j]] + nums[j])1.dp[j]含义:背包容量为j时,放进物品后,背的最大重量为dp[j]

2024-05-24 23:53:08 171

原创 第四十二天 | 背包问题理论

2.递推公式:此时dp[j]有两个选择,一个是取自己dp[j] 相当于 二维dp数组中的dp[i-1][j],即不放物品i,一个是取dp[j - weight[i]] + value[i],即放物品i,指定是取最大的,毕竟是求最大价值。2.递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);首先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],无论是选取哪些物品,背包价值总和一定为0。

2024-05-23 23:28:53 530

原创 第四十一天 | 62.不同路径 63.不同路径|| 343.整数拆分 96.不同的二叉搜索树

确定遍历顺序,先来看看递归公式:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));2.状态转移方程:dp[i][j] = dp[i - 1][j] + dp[i][j - 1](遇到空位置才进行计算)dp[i] 是依靠 dp[i - j]的状态,所以遍历i一定是从前向后遍历,先有dp[i - j]再有dp[i]。2.动态转移方程:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]拆分0和拆分1的最大乘积是多少?

2024-05-21 21:07:34 317

原创 第四十天 | 509.斐波那契数 70.爬楼梯 746.用最小花费爬楼梯

所以dp[5] = dp[4] + dp[3].2.动态转移方程:dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] = cost[i - 2])2.确定递推公式:dp[i] = dp[i - 1] + dp[i - 2]2.递推关系:dp[i] = dp[i -1] + dp[i - 2]1.dp数组含义:dp[i]代表到达第i阶台阶有dp[i]种方法。3.dp数组初始化:dp[1] = 1, dp[2] = 2。4.遍历顺序:从前向后。

2024-05-21 19:53:35 273

空空如也

空空如也

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

TA关注的人

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