- 博客(80)
- 收藏
- 关注
原创 【iOS】使用respondsToSelector方法前是否需要对方法调用者进行判空操作?
在iOS开发中,经常需要将事件传递给上层代理去处理,这个时候会用到『respondsToSelector』去检测上层代理是否有实现对应的方法,如果实现了,才会去调用。而项目中,很少直接调用respondsToSelector,而是调用了一个宏。&&可以从宏的定义里发现,实际上就是在调用系统respondsToSelector方法前,先对方法调用者delegate进行了一个判空操作。但实际上我们开发时是否需要这个判空操作?
2023-09-27 13:17:09
672
原创 【leetcode】 n 的第 k 个因子
题目:给你两个正整数 n 和 k 。如果正整数 i 满足 n % i == 0 ,那么我们就说正整数 i 是整数 n 的因子。考虑整数 n 的所有因子,将它们 升序排列 。请你返回第 k 个因子。如果 n 的因子数少于 k ,请你返回 -1 。原题链接思路:思路1暴力遍历,使用for循环对于range(1,n+1),逐个遍历,如果符合要求【当前i值是正整数n的因子】就加到列表alist中,得到的结果自然是升序,得到所有n的因子后,利用列表索引k-1返回n的第k个因子。还要注意返回-1的情况,得
2021-04-04 18:02:13
317
原创 【sort()方法与sorted()函数】数组sort()方法使用后报错object of type ‘NoneType‘
场景:美团笔试题——正则序列下面的代码运行后报错【TypeError: object of type ‘NoneType’ has no len()】分析:len(sorted_list)处的错误,意为sorted_list为NoneType往上找sorted_list的定义,sorted_list=list(map(int,s.split())).sort()def minopt(s): if s is None: return sorted_list=list
2021-04-02 17:15:50
398
原创 Day20 二维数组中的查找
题目:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。leetcode原题链接思路:从矩阵(二维数组)的右上角开始遍历若当前元素大于目标整数target,往下继续寻找若当前元素小于目标整数target,往左继续寻找若遍历完整个矩阵都没找到target,return False代码:时间复杂度O(m+n)m为矩阵行数,n为矩阵列数,和代码对应clas
2021-02-28 16:23:03
163
1
原创 Day20 数组中数字出现的次数 II
题目:在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。leetcode原题链接思路:哈希表创建字典对象recordkey值为nums中的数字value值对应 该数字在nums数组中出现的次数遍历完nums数组后,返回字典record中value为1 对应的key值重点在于,如何找到字典中指定value对应的key值代码:class Solution: def singleNumber(self, nums: List[in
2021-02-13 11:30:52
161
原创 【python】index()方法与字典对象
index()方法检测字符串中是否包含子字符串 str,并返回索引值;从列表中找出某个值第一个匹配项的索引位置。字典对象能直接用index()方法吗?对于字典record={5: 3, 2: 3, 4: 1},执行index()方法,企图找到value为1对应的索引值报错:字典对象,不能直接使用index()方法搜索得知:index()方法的使用对象为列表/字符串字典对象如何使用index()方法?由前文知,字典对象本身并不存在index()方法,列表类型存在index()方法。若想找到
2021-02-13 11:21:21
7230
3
原创 Day20 数据流中的中位数
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。leetcode原
2021-02-07 22:44:29
203
原创 Day19 和为s的连续正数序列
题目:输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1: 输入:target = 9 输出:[[2,3,4],[4,5]]leetcode原题链接思路:双指针法(滑动窗口)参考链接双指针初始值:left=1,right=2这里直接用指针的值来代表序列中的数字。双指针变化规则:根据【左右指针之间滑动窗口内的数值和s】与目标值【target】的大小关系来变化s <
2021-02-07 01:32:40
169
原创 Day19 圆圈中最后剩下的数字
引入热土豆问题:热土豆问题——“击鼓传花”的土豆版本传烫手的热土豆,鼓声停的时候,手里有土豆的小孩要出列解决思路:用队列来实现热土豆问题的算法,参加游戏的人名列表,以及传土豆次数num,算法返回最后剩下的人名模拟程序采用队列来存放所有参加游戏的人名,按照传递土豆方向从队首排到队尾注:游戏时,队首始终是持有土豆的人模拟游戏开始,只需要将队首的人出队,随即再到队尾入队,算是土豆的一次传递传递num次后,将队首的人移除,不再入队如此反复,直到队列中剩余一人题目:0,1,···,n-1这n个
2021-02-06 16:34:22
184
原创 Day19 二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。leetcode原题链接思路:中序遍历代码模板:def dfs(root): if not root: return#边界条件,到最左端的叶子节点时,return dfs(root.left) # 遍历当前根节点的左子树 print(root.val) # 对当前根节点做操作 dfs(root.right) # 遍历当前根节点的右子树
2021-02-06 01:13:32
113
原创 Day18 礼物的最大价值
题目:在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?leetcode原题链接思路:DFS由于直接暴力DFS会超时,这里采用一个嵌套列表record来记录已计算过的dfs(i,j)的值。嵌套列表record初始化,元素全为0,因为m*n的棋盘中每个礼物都有价值(每个元素都大于0),计算过dfs(i,j
2021-02-05 00:16:00
150
原创 python中嵌套列表的创建问题
问题引出:创造嵌套列表dlist,可视为四行三列的矩阵,其中每个元素都为0。将1赋值给索引为[0][0]的元素,预期效果为[[1,0,0],[0,0,0],[0,0,0],[0,0,0]],实际效果如下图所示解析:创建嵌套列表dlist时,list1=[0]*3,创建了list1列表,为[0,0,0]list2=[list1]*4=[[0]*3]*4,即为[0,0,0]*4,list2中的每个小列表都指向list1列表的内存,当对list2的任意子列表进行修改,会修改指向list1列表
2021-02-05 00:04:12
1187
原创 Day18 机器人的运动范围
题目:思路:代码:错误代码:思路:两个for循环遍历方格中所有区域,进行当前位置数位和与k的判断,若符合要求,count+1错误原因:丢弃了一个重要特征,题目背景是机器人的移动,每次可以向左、右、上、下移动一格,不能横跨多个格子移动。例如输入m=16,n=8,k=4,符合题目要求的格子有15个i=0,j=0,1,2,3,4i=1,j=0,1,2,3i=2,j=0,1,2i=3,j=0,1i=4,j=0而代码运行结果还会有i=10,j=0,1,2,3,4…等错误在于,当出现
2021-02-04 01:23:54
153
2
原创 Day18 矩阵中的路径
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行
2021-02-03 23:10:42
99
1
原创 Day17 扑克牌中的顺子
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。leetcode原题链接思路概要:输入数组中的五个元素中,满足下面两个要求,即可构成顺子除‘0’外,最大元素-最小元素<5且,除‘0’外,无重复元素代码解析创建set()集合,命名为repeat,后续用add()方法【这里不一定非要创建集合,也可以创建list()列表类型,后续用appen
2021-02-02 01:35:07
242
原创 Day17 股票的最大利润
题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?示例 1:输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 =6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。.示例 2:输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。leetcode原题链接思
2021-02-02 00:29:17
121
原创 Day17 从上到下打印二叉树 III【交替打印】
题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。leetcode原题链接思路:该题是从上到下打印二叉树的变式。两处改动列表tmp【用来存储当前遍历层元素的】,原题创建tmp为list型,这题创建tmp为双端队列:list——>collections.deque当前遍历奇数层,tmp.append()当前遍历偶数层,tmp.appendleft()可实现【打印顺序交替变化】的
2021-01-29 00:43:52
141
原创 Day16 剪绳子
题目:给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。leetcode原题链接思路:类似斐波那契数列的解法递推代码:class Solution: def cuttingRope(self, n: int) ->
2021-01-28 23:07:06
114
原创 Day15 队列的最大值
题目:请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1leetcode原题链接思路:调用python的collections库,collections.deque()创建双端队列双端队列的操作方法:append()在队尾添加一个元素;pop()在队尾弹出一个元素appendleft()在** 添加一个元
2021-01-28 21:22:58
116
1
原创 Day15 包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。leetcode原题代码思路:可以用python的min()函数实现,但不符合出题者本意。列表对象的append()和pop()方法,可以模拟栈的压入(push)弹出(pop),创建一个数据栈和辅助栈数据栈self.stack,存储所有入栈元素辅助栈self.mstack,存储入栈以来的历届最小元素参考大佬题解代码:class M
2021-01-28 18:44:24
83
原创 Day15 二叉树中和为某一值的路径
题目:输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。leetcode原题链接思路:深度优先搜索代码:# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right =
2021-01-28 01:07:53
104
原创 Day14 求1+2+…+n【Q】
题目:求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。leetcode原题链接思路:短路求值。C语言/C++中,逻辑与【&和&&】的区别&两边 都会运算&&先算左侧,若左侧为假【False】,右侧就不运算了【|和||同理】||先算左侧,若左侧为真【True】,右侧就不运算了python中,用and和or来实现短路求值代码:① C++class
2021-01-27 23:26:23
87
原创 Day14 构建乘积数组
题目:给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。leetcode原题链接思路:B[i]=A[0] * A[1] * …* A[i-1] * A[i+1] * … * A[n-1]将表达式拆分为前后两部分的乘积B[i]=mul_pre[i]*mul_pre[i]mul_pre[i]=A[0] *
2021-01-27 18:43:21
74
原创 Day14 树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。leetcode原题代码思路:函数isSubStructure(A,B) 先遍历树A,直至找到A树下节点.val==B.val定义子函数ispart(p1,p2)来判定树p1/A是否包含树B代码:# Definition for a binary tree node.# class TreeNode:# def __init__(self,
2021-01-26 20:35:40
186
原创 Day13 调整数组顺序使奇数位于偶数前面【Q】
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。leetcode原题代码思路:双指针法(双指针)初始状态:left指针最左,right指针最右(循环)终止条件:left指针和right指针相遇(双指针)变化规则:left指针遇到奇数,右移,直至遇到偶数后停下;right指针遇到偶数,左移,直至遇到计数后停下;left、right指针均停下时,交换指针所指元素,并且left指针继续右移,right指针继续左移代码:
2021-01-25 23:50:48
85
原创 Day13 最小的k个数
题目:输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。leetcode原题链接思路:sorted()函数,对列表arr进行排序,得到递增数组new_arr取新数组new_arr的前k个元素即可,下标对应0~k-1代码:class Solution: def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
2021-01-25 23:00:13
70
原创 Day13 旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。leetcode原题链接思路1:利用python中 列表对象的min()方法,返回列表元素的最小值。语法:min(list)代码1:class Solution: def minArray(self, numbers: List[int]) -> int:
2021-01-25 11:32:03
228
2
原创 Day12 重建二叉树【递归】
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。leetcode原题思路:前序遍历:根左右中序遍历:左根右python中列表对象的index方法,返回列表中查找元素的索引值根节点在中序遍历序列中的索引为 index,证明:左边有index个元素,而左边的元素均为左子树的节点,所以有左子树有index个元素。前序遍历 根节点后紧跟左子树的节点,preorder[0]是根节点,其后index个元素是左子树节点。而preorde
2021-01-24 22:58:10
82
2
原创 Day12 栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。leetcode原题链接思路:给定一个压入序列 pushedpushed 和弹出序列 poppedpopped ,则压入 / 弹出操作的顺序(即排列)是 唯一确定 的。借用辅助栈stack,模拟栈的压
2021-01-24 20:44:23
183
2
原创 Day12 丑数
题目:我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。leetcode原题链接思路:参考题解原始思路:判断每个数是不是丑数,直到丑数数量达到n,该方法会超时利用丑数的递推性质丑数只包含因子 2, 3, 5 ,因此有 “丑数 == 某较小丑数 × 2/3/5”代码:class Solution: def nthUglyNumber(self, n: int) -> int: dp=[1]*n#
2021-01-24 19:43:20
108
1
原创 Day11 字符串的排列
题目:输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。leetcode原题链接思路:引入python的内建模块itertoolsitertools.permutations(iterable, r=None)用法:连续返回由 iterable 元素生成长度为 r 的排列。如果 r 未指定或为 None ,r 默认设置为 iterable 的长度,这种情况下,生成所有全长排列。ps:itertools.permutations
2021-01-24 00:06:51
118
1
原创 Day11 数组中数字出现的次数【待优化】
题目:一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。leetcode原题链接思路:用set()函数,先将数组nums简化,得到无重复数字的元素集。再用for循环遍历 计数count()res用来存放最终输出的结果(列表形式)n用来计数,表示目前找到了几个【只出现一次的数字】当n==2时,return 此时的res,函数终止运行。代码:时间复杂度和空间复杂度未满足题目要求,暴力提交cla
2021-01-23 16:31:49
93
原创 Day11 复杂链表的复制
题目:请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。leetcode原题链接思路:三个步骤:复制链表节点 至原节点后给新Node复制random指向拆开链表代码:"""# Definition for a Node.class Node: def __init__(self, x: int, next: 'Node' = None,
2021-01-23 16:21:28
148
1
原创 Day10 数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。leetcode原题链接思路:对数组中出现的每个元素 进行计数即可,使用列表对象的count()方法注意,若直接对数组nums使用for循环遍历,代码运行会超时,如文末的【超时代码】。这里我们用到set()函数,创建一个不重复的元素集temp,再对temp进行for循环遍历,对其中的每个元素进行计数,如果大于len(nums)/2,直接return此时的计数元素。set
2021-01-22 23:13:10
92
原创 Day10 二叉搜索树的后序遍历序列【待优化】
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。leetcode原题思路:二叉搜索树:空树左子树(上的所有节点)比根节点小,右子树(的所有节点)比根节点大中序遍历是递增序列前序遍历:根左右中序遍历:左根右后序遍历:左右根输入的数组是【二叉树的后序遍历】,所以,数组最后一个元素是 整棵二叉树的根节点代码:class Solution: def verifyPost
2021-01-22 22:55:31
122
原创 Day10 滑动窗口的最大值【双指针法】【待优化】
题目:给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。leetcode原题链接思路:双指针法,考虑三个问题:双指针的初始值遍历终止条件左右指针的变化规则滑动窗口大小固定,始终为k,且滑动窗口需遍历整个数组nums。初始值:left=0,right=k-1,(right-left)始终为k。终止条件:right=len(nums)-1,滑动窗口遍历完整个数组,此时right指针在数组最右端。变化规则:left和right同时+1其他知识点:列表对
2021-01-22 21:56:49
122
原创 Day9 最长不含重复字符的子字符串【双指针法】【待优化】【笔试已遇到】
题目:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。【注意:子字符串 != 子序列,如"pwwkew"中,最长字串是"wke",“pwke” 是一个子序列,不是子串】leetcode原题链接思路:初始状态:左指针left=0,右指针right=0终止条件:①右指针right遍历完字符串s进入while循环while循环的条件是while(right!=len(s)-1),子字符串的右指针到 字符串最右,此时字符串已遍历完。right+=1,如果strin
2021-01-22 21:34:33
117
原创 Day9 和为s的两个数字【双指针法】
题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。leetcode原题链接思路:双指针法需要区分此处的指针与C/C++中的指针,此处指针即索引。初始状态:左指针left=0,右指针right=len(nums)-1。【分别处于递增数组的最左和最右】进入while循环while循环的条件是while left<right而非while left<=right,不考虑左右指针相等时的情况,因为题目要求在
2021-01-22 17:07:04
96
1
原创 Day9 第一个只出现一次的字符【待优化】
题目:在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。leetcode原题链接思路:利用python中 字符串对象的count()方法先for循环按序遍历字符串s中的每个元素(字符串类型),如果当前元素i在字符串s中只出现一次,return i,找到第一个【只出现一次的字符】了,直接终止函数,不再遍历/运行(return的功能)。若for循环遍历完了,仍未找到,证明字符串s中没有【只出现一次的字符】,return ’ ’代码:class Solut
2021-01-22 00:32:23
167
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人