- 博客(295)
- 收藏
- 关注
原创 【一刷《剑指Offer》】面试题 50(案例):树中两个结点的最低公共祖先
由此可以写出递归代码,直到 p、q 既不同时大于 root,也不同时小于 root,则 root 就是 p、q 的最近公共祖先,返回 root。从上往下遍历,判断根结点是否匹配两个节点之一。如果是,则根结点就是最低祖先,否则往下递归遍历左右子树。题目要求从根结点为 root 的树返回 p、q 的最近公共祖先,使用递归。
2024-07-21 12:39:11
198
原创 【一刷《剑指Offer》】面试题 49(案例):把字符串转换成整数
题目要求返回的数值范围应在 [−2^31, 2^(31−1)] ,因此需要考虑数字越界问题。而由于题目指出 环境只能存储 32 位大小的有符号整数 ,因此判断数字越界时,要始终保持 res 在 int 类型的取值范围内。在每轮数字拼接前,判断 res 在此轮拼接后是否超过 INT_MAX(2147483647),若超过则加上符号位直接返回。
2024-07-21 12:35:38
185
原创 【一刷《剑指Offer》】面试题 48:不能被继承的类
《剑指Offer》对应内容:可参考:【C++】继承 -- 详解_c++,两个派生类继承一个基类,声明对象的时候用基类的对象。-CSDN博客
2024-07-21 12:10:13
44
原创 【一刷《剑指Offer》】面试题 47:不用加减乘除做加法
不使用新的变量,交换两个变量的值。比如有两个变量 a、b,我们希望交换它们的值。补码的优势:加减法可以统一处理(CPU 只有加法器)。因此,以上方法同时适用于正数和负数的加法。在计算机系统中,数值一律用。
2024-07-21 12:07:09
151
原创 【一刷《剑指Offer》】面试题 46:求 1+2+...+n
在 Solution 类中,通过 mechanicalAccumulator 方法控制累加器的行为:首先重置累加器的状态,然后创建一定数量的 Temp 对象,最后返回累加器累计的结果。通常实现递归的时候我们都会利用条件判断语句来决定递归的出口,但由于题目的限制我们不能使用条件判断语句,那么我们就要选择使用别的办法来确定递归出口 —— 逻辑运算符的短路性质。上面书中讲到的第四种方法在这里无法实现,因为题目的 n 是动态的,所以无法使用模板类型求解。
2024-07-21 11:31:28
137
原创 【一刷《剑指Offer》】面试题 44:扑克牌的顺子
因此,可以将问题转化为:这 5 个朝代是否满足以上两个条件?根据题意,这 5 个扑克牌对应的数字连续的。
2024-07-21 10:43:31
144
原创 【一刷《剑指Offer》】面试题 43:n 个骰子的点数
所以最终需要返回的浮点数组的内容就会是这个样子:[#n / pow(6.0, n), #(n + 1) / pow(6.0, n), #(n + 2) / pow(6.0, n), ..., #6n / pow(6.0, n)]。投掷 n 个骰子,那么就会有 n 个面朝上,这 n 个朝上的面的点数之和 s 的最大值是 6*n,最小值是 n。:假如只有一个骰子(n=1),s 的范围是 [n, 6n],所以 s 的范围是 [1, 6],且 s 的每个值可能出现的次数都为 1。,k 属于 [1, 6]。
2024-07-21 10:26:58
194
原创 【一刷《剑指Offer》】面试题 42:翻转单词顺序 VS 左旋转字符串
思考一下,将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒序了,那么再把单词反转一下,单词不就正过来了。不要使用辅助空间,空间复杂度要求为O(1)。不能使用辅助空间之后,那么只能在原字符串上下功夫了。保存第一个,剩下的整体前移一个,第一个放在最后,完成一次移动,一次能移动,多次也可以。举个例子,源字符串为:"the sky is blue "字符串反转:"eulb si yks eht"单词反转:"blue is sky the"(3)思路三(双倍字符串,不推荐)(2)思路二(逆置)
2024-07-21 08:50:31
286
原创 【一刷《剑指Offer》】面试题 41:和为 s 的两个数字 VS 和为 s 的连续正数序列
注意,代码中只给你你目标和,其实隐含条件就是序列最大值不会大于该值,而且要连续,这也是细节。初始化:双指针 left,right 分别指向数组 price 的左右两端。计算和:sum=price[left]+price[right];若循环结束,则返回空数组,代表无和为 target 的数字组合。的思想进行解决,这种方式可以说很优秀了。循环搜索:当双指针相遇时跳出。
2024-07-21 08:48:50
214
原创 【一刷《剑指Offer》】面试题 40:数组中只出现一次的数字
分组的结果一定是:相同数据被分到了同一组,不同数据一定被分到了不同的组就将问题就转化成了两个上面的问题。时,我们把数组中所有的数依次异或运算,最后剩下的就是落单的数,因为成对儿出现的数都相互抵消了。然后把这两个组按照最开始的思路,依次异或,剩余的两个结果就是这两个只出现一次的数字。如果只有一个数据单独出现,直接整体异或可以得到结果。我们就取第一个 1 所在的位数,假设是第 3 位,接着把原数组分成。,首先可以采取先整体异或,异或结果一定不为 0(,因为相同数字所有位都相同,而不同的数。(假设是A 和 B)
2024-07-21 08:46:37
249
原创 【一刷《剑指Offer》】面试题 39:二叉树的深度
明确单层递归的逻辑:如何判断当前传入节点为根节点的二叉树是否是平衡二叉树呢,当然是左子树高度和右子树高度相差。分别求出左右子树的高度,然后如果差值小于等于 1,则返回当前二叉树的高度,否则则返回 -1,表示已经不是二叉树了。这道题题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。而根节点的高度就是二叉树的最大深度,所以这道题我们通过后序求的根节点高度来求的二叉树最大深度。在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度。
2024-07-21 08:45:36
246
原创 【一刷《剑指Offer》】面试题 38:数字在排序数组中出现的次数
二分查找中,寻找 st 即为在数组中寻找第一个大于等于 target 的下标,寻找 right 即为在数组中寻找第一个大于 target 的下标,然后将其下标减一。两者的判断条件不同,所以在二分的时候要注意判断条件。用两个变量记录第一次和最后一次遇见 target 的下标,但这个方法的时间复杂度为 O(n),没有利用到数组升序排列的这个条件。(记为 right)。当 target 在数组中存在时,target 在数组中出现的次数为。考虑 target 在数组中出现的次数,其实我们要找的就是数组中。
2024-07-21 08:44:26
122
原创 【一刷《剑指Offer》】面试题 37:两个链表的第一个公共结点
如果把图 5.3 逆时针旋转 90°,我们就会发现两个链表的拓扑形状和一棵树的形状非常相似,只是这里的指针是从叶结点指向根节点的。两个链表的第一个公共结点正好就是二叉树中两个叶节点的最低公共祖先。,后面大家的步调一致,往后找第一个地址相同的节点,就是题目要求的节点,所以需要各自遍历两次链表。题目要求是单链表,所以如果有交点,则最后一个链表的节点地址一定是相同的。让长的链表先走 abs(length1-length2) 步。求第一公共节点,本质是。
2024-07-21 08:23:30
215
原创 【一刷《剑指Offer》】面试题 35:第一个只出现一次的字符
如果需要判断多个字符是不是在某个字符串里出现过或者统计多个字符在某个字符串中出现的次数,我们可以考虑基于数组创建一个简单的哈希表,这样可以用很小的空间消耗换来时间效率的提升。例如从第一个字符串 "We are students." 中删除在第二个字符串 "aeiou" 中出现过的字符得到的结果是 "W r stdnts."。问题:在英语中,如果两个单词中出现的字母相同,并且每个字母出现的次数也相同,那么这两个单词互为变位词(Anagram)。问题:定义一个函数,删除字符串中所有重复出现的字符。
2024-07-20 21:20:46
791
原创 【一刷《剑指Offer》】面试题 34:丑数
根据题意,每个丑数都可以由其他较小的丑数通过乘以 2 或 3 或 5 得到。所以,我们可以考虑使用一个优先队列保存所有的丑数,每次取出最小的那个,然后乘以 2 , 3 , 5 后放回队列。然而,这样做会出现重复的丑数。为了避免重复,我们可以用三个指针 p2、p3、p5 来分别表示下一个丑数是当前指针指向的丑数乘以 2、3、5。
2024-07-20 20:20:46
195
原创 【一刷《剑指Offer》】面试题 33:把数组排成最小的数
我们将说法换一下,对于本题而言,我们要的有效序列是:序列中任何一个元素 y,和它前的任何一个元素 x 进行有序组合形成 xy,比和他后面的任何一个元素z进行有效序列组合 yz,满足条件 xy < yz(采用字典序列排序),如 {32,31},有效组合是 3132,所以我们拍完序列之后序列变成 {31,32}。可以采用字符串来表示数字,这样就能简洁地解决大数问题。这道题的核心理解是对于排序算法的理解。通常我们所理解的排序是比较大小的,比如:升序排序的序列意思是:序列中任何一个数字都比前面的小,比后面的大。
2024-07-20 19:58:24
297
原创 【一刷《剑指Offer》】面试题 32:从 1 到 n 整数中 1 出现的次数
10个数会出现 1, 那么有多少个 这样的数呢?有 34 个 这样的数 加 十位为 1的十个数 即 34 * 10 + 10。什么时候个位会出现 1 呢,当然只有一种可能,那就是 1 ,那么有多少个 个位 为 1的数呢?有342个 加 1(这个 1 为 数字 1) 即 342 * 1 + 1个。那就只有 0 * 1000 个了,因为千位为 0 , 很显然最高为不可能为零。以此类推,会有 0 * 1000 加上 千位为 1 的个数 即 0 * 100 + 1000。那就有 342 个个位为 1 的数。
2024-07-20 19:56:55
125
原创 【ProtoBuf】通讯录实现(网络版)
XML、JSON、ProtoBuf 都具有数据结构化和数据序列化的能力。XML、JSON 更注重数据结构化,关注可读性和语义表达能力。ProtoBuf 更注重数据序列化,关注效率、空间、速度,可读性差,语义表达能力不足,为保证极致的效率,会舍弃⼀部分元信息。ProtoBuf 的应用场景更为明确,XML、JSON 的应用场景更为丰富。
2024-07-19 18:17:01
1139
1
原创 【Python】使用库 -- 详解
就是别人已经写好了的代码,可以让我们直接拿来用。一个编程语言能不能流行起来,一方面取决于语法是否简单方便容易学习,一方面取决于生态是否完备。所谓的 “生态” 指的就是语言是否有足够丰富的库,来应对各种各样的场景。在实际开发中,也并非所有的代码都自己手写,而是要充分利用现成的库,简化开发过程。按照库的来源,可以大致分成两大类:标准库:Python 自带的库。只要安装了 Python 就可以直接使用。第三方库:其他人实现的库。要想使用,需要额外安装。
2024-07-18 08:59:48
1326
3
原创 【ProtoBuf】初识 ProtoBuf
你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。Protocol Buffers 是 Google 的一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。Protocol Buffers 类比于 XML,是一种灵活,高效,自动化机制的结构数据序列化方法,但是比 XML 更小、更快、更为简单。依赖生成的接口,将编译生成的头文件包含进我们的代码中,实现对 .proto 文件中定义的字段进行。称为对象的反序列化。
2024-07-16 17:05:33
642
原创 【Python】基础语法(函数、列表和元组、字典、文件)
方法其实就是函数。只不过函数是独立存在的,而方法往往要依附于某个 “对象”。像上述代码 a.append,append 就是依附于 a,相当于是 “针对 a 这个列表进行尾插操作”。
2024-07-16 12:58:05
1237
4
原创 【错题集-编程题】dd 爱科学 1.0(最长上升子序列 - 贪心 + 二分)
当考虑一个字符能否和前面的子序列组成非递增子序列时,不需要知道它是怎样的,只需要知道它的末尾字符是什么就行。所以,只需要将长度为 x 的所有子序列中,最小的末尾存起来。因为这道题的数据范围比较大,所以排除动态规划(N^2),应该用贪心 + 二分(N*logN)求出最长非下降子序列的长度。算法思路:要想改动最小,就应该在最长非下降子序列的基础上,对不是最长的部分进行更换。这道题目需要着重理解 dp 的含义,可以先自己模拟一下需要存储的数据的过程。
2024-07-16 00:13:40
145
原创 【错题集-编程题】kotori 和素因子(dfs)
这道题目就是用 dfs 来枚举,可以自己模拟一下深搜的过程,只不过一开始会有很多个分支,但到后面分支会越来越少。递归型枚举所有的情况。
2024-07-16 00:01:22
286
原创 【错题集】ruby 和薯条(排序 + 二分 / 双指针)
双指针部分思路繁琐了,还有就是求前缀和的函数返回值的类型忘记修改为 long long 了...2、解法二:排序 + 前缀和 + 双指针。区间内数对的个数,可以用双指针快速统计出以。区间内数对的个数,可以转化成求。1、解法一:排序 + 二分。先排序,然后枚举较⼤值,在。区间找差值的左右端点即可。
2024-07-14 17:05:50
432
原创 【软件测试】自动化测试常用函数 -- 详解
我们的自动化脚本⼀般部署在机器上自动的去运行,当自动化运行出现了报错,仅仅通过终端的错误提示给到的有用信息是一定的,若能将当时的页面变化截图抓拍下来,记录当时的错误场景,能更好的定位问题并解决问题。当我们手工测试的时候,我们可以通过眼睛来判断当前的窗口是什么,但对于程序来说它是不知道当前最新的窗口应该是哪一个的。的比较灵活可以选择控件的任意属性,上面的例子中,find_element_by_css_selector("#kw") 通过 find_element_by_css_selector( )
2024-07-14 11:35:04
697
3
原创 【MySQL 进阶】MySQL 程序 -- 详解
一、MySQL 程序简介一、MySQL 程序简介MySQL 安装完成通常会包含如下程序:1、Linux 系统程序⼀般在 /usr/bin 目录下,可以通过命令查看:2、Windows系统目录:你的安装路径\MySQL Server 8.0\bin,可以通过命令查看:每个 MySQL 程序都有许多不同的选项。大多数程序都提供一个--help选项,可以使用该选项来获取程序不同选项的描述。
2024-07-13 21:08:51
1877
6
原创 【错题集-编程题】四个选项(DFS + 剪枝 + 哈希表)
有一个剪枝的逻辑没弄明白,x 题和 y 题答案相同可以有一种剪枝策略,其中包含两个不同思路。dfs 这类题目主要就是考察代码编写能力,后期可以多做类似的题目。填写某个数时,要看看符不符合若干题的选项必须相同。填写某个数时,要看看还有没有剩余次数。
2024-07-13 18:31:42
404
原创 【错题集-编程题】栈和排序(栈 + 贪心)
没有处理好 maxi 的变化,导致下一个数不是比 maxi 小时,输出结果不符合题意。每次尽可能的先让当前需要的最大值弹出去。
2024-07-12 20:34:41
611
原创 【Python】人生重开模拟器(实现代码)
这是一款文字类小游戏。玩家输入角色的初始属性之后,就可以开启不同的人生经历。完整的程序代码较多,此这里(主要目的:巩固前面学习的 Python 语法基础)。
2024-07-12 16:04:49
1309
原创 【Python】基础语法(顺序语句、条件语句、循环语句)
默认情况下,Python的代码执行顺序是按照从上到下的顺序,依次执行的。编程是一件明确无歧义的事情,安排好任务的顺序,计算机才能够正确的进行执行。
2024-07-12 14:36:27
626
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人