- 博客(656)
- 收藏
- 关注
原创 【给所有纠结测试开发还是开发的忠告】
一些事实在美团、滴滴、阿里,测试开发和开发的校招是平薪的,其他大厂不平薪。大概测开的ssp相当于开发的sp, 测开的sp相当于开发的白菜。测开只有极少数的人是真正的做测试工具、测试平台研发,大部分还都是业务,即点点点。点点点的发展在于项目的综合管理,发散性思维等,想走测开,测试思维非常重要,比技术要重要。测开职级在某些公司比开发低一级,比如字节。测开的2-1相当于研发的1-2.关于升职,我认识3年升2级的测开,也见过3年不升的测开。看团队,看机遇,看领导,基本不看个人技术水平。测开需求量少,竞争
2022-02-19 12:37:34 1198
原创 四月工作计划
由于疫情,很多书不在身边,调整一下工作计划。4.1-4.6 MySQL必知必会,笔记做完,练习量跟上。产出:CSDN。4.7-4.10 复习计算机网络。 产出:无,再读一遍网络是怎样连接的。4.11-4.20 Linux命令行与shell脚本编程大全。产出:CSDN。4.21-4.23 Linux Shell命令行及脚本编程实例详解。 产出:CSDN(对上一个的补充)。4.24-4.27...
2020-04-02 14:12:13 224
原创 校招冲冲冲时间表
1月:数据结构+计算机网络2月:数据结构+操作系统3月:算法+数据库(MySQL+Redis)4月:算法+Jenkins, Docker,Git5月:算法+Java开发6月:复习一遍+Java开发要准备的项目:1个前端项目1个后端项目1个自动化测试框架项目...
2020-01-05 18:28:14 265
原创 【python】特殊变量
特殊变量__file__这个变量表明了当前脚本(即当前文件的路径)。print(__file__)结果:D:/myProject/interview/test.py这样会输出当前目录的路径(可能是绝对路径也可能是相对路径)。这有啥用?用处大了。可以用它来拿到标准的绝对路径。print(os.path.abspath(__file__))输出:D:\myProject\interview\test.py另外,还可以用这个拿到目录:print(os.path.dirname(os.
2022-03-22 22:47:59 1417 1
原创 flask程序使用celery
写在开头celery是一个分布式并行框架,适合一些并行任务。跟web程序结合可以实现web程序和业务代码的解耦合,celery是采用多进程方式进行的,所以能够有效利用多核CPU。celery对于目录的层级结构要求非常高!要求非常高!然而在网络上搜到的教程都写的七零八落的,不成体系,随便截个图就当做一篇博客。为了解决以上问题,于是打算撰写这篇博客。celery目录结构学习celery从这里学。目录结构长这样。其中,flasky是flask项目的根目录。当然它也可以是其他web程序的根目录。pr
2022-03-03 23:23:20 8344 1
原创 【leetcode】2022.1.9 按键持续时间最长的键
按键持续时间最长的键分析这题有两种办法。第一个是排序,先按照字母排好序,然后再按照数字差值进行排序。排序的话要选择稳定的排序算法(保证字母是有序的)。也可以用在线处理的办法,同时记录当前最大的差值和对应的字符。排序法 - O(nlogn)在线处理法 - O(n)排序法class Solution: def slowestKey(self, releaseTimes, keysPressed: str) -> str: if not keysPressed:
2022-01-12 11:55:46 264
原创 【leetcode】2022.1.8格雷编码
格雷编码分析格雷编码,就是说二进制位只跟相邻位差1位不同的编码,且在一个格雷编码序列中,某个数字只能出现一次。只差一位可以用镜像+1法。代码class Solution: def grayCode(self, n: int): res, head = [0], 1 for i in range(n): for j in range(len(res) - 1, -1, -1): res.append(h
2022-01-12 11:16:00 3275
原创 【leetcode】2022.1.7. 括号的最大嵌套深度
1614. 括号的最大嵌套深度分析这题一开始没认真读题,没看到给的s是个有效括号字符串。像这种括号问题,用栈就对了。代码class Solution: def maxDepth(self, s: str) -> int: stack = [] res = 0 for i in s: if i == '(': stack.append('(') res
2022-01-07 16:10:29 2678
原创 【leetcode】2021.1.6 简化路径
71. 简化路径分析这题其实就是考察栈的应用。如果碰到..就pop出去,如果是.就不处理,如果是普通的就压到栈里去。代码class Solution: def simplifyPath(self, path: str) -> str: path = path.strip('/') path_li = path.split('/') stack = [] for i in path_li: if i
2022-01-07 10:26:45 3427
原创 【leetcode】2022.1.5. 替换所有的问号
1576. 替换所有的问号分析这题没啥难的,维护一个set存储所有的字母。看相邻的字母如果在这个set里,就从set中删掉。然后从set中随机出来一个字母来替换当前的?即可。代码class Solution: def modifyString(self, s: str) -> str: mem_set = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
2022-01-05 19:54:08 928
原创 【leetcode】剑指 Offer 19. 正则表达式匹配
剑指 Offer 19. 正则表达式匹配分析这题给我恶心吐了。两年前还能写出来优雅的dp,现在只能靠递归+ifelse大法勉强a掉的样子。递归法动态规划法递归法class Solution: def isMatch(self, s: str, p: str) -> bool: # pattern串用完了的情况 if len(p) == 0: return len(s) == 0 # 原串用完了的情况 if len
2022-01-05 18:45:59 264
原创 【leetcode多线程】按序打印
按序打印分析这题直接用信号量模拟即可。代码class Foo: MUTEX = 2 def __init__(self): pass def first(self, printFirst: 'Callable[[], None]') -> None: while True: if Foo.MUTEX == 2: # printFirst() outputs "f
2022-01-04 23:42:17 203
原创 【leetcode】剑指 Offer 18. 删除链表的节点
剑指 Offer 18. 删除链表的节点分析这题就是删除链表中的结点问题。为了对链表进行统一处理,我们可以弄一个空结点给他接上,然后用双指针法就能进行归一化处理了。双指针法# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def deleteN
2022-01-04 13:30:06 341
原创 【leetcode】剑指 Offer 17. 打印从1到最大的n位数
剑指 Offer 17. 打印从1到最大的n位数分析这个题,python直接暴力解就行。搞到一个最大值,然后用列表推导。Python法class Solution: def printNumbers(self, n: int) -> List[int]: maxs = 10**n return [i for i in range(1, maxs)]...
2022-01-04 13:22:40 484
原创 【leetcode】剑指 Offer 16. 数值的整数次方
剑指 Offer 16. 数值的整数次方分析这题看似简单,用模拟法就能搞定,但用模拟法会超时。即用O(n)的办法会超时。按照一个正统的CS学生来说,用动态规划法更符合从技术上解决问题。快速幂法更数学一些。模拟法 - O(n)快速幂 - O(logn)动态规划 - O(logn)且题目中说的n是整数,即可能是负数,所以要处理一下。动态规划法其实就是记忆化递归法。模拟法class Solution: def myPow(self, x: float, n: int) ->
2022-01-04 13:15:53 196
原创 【leetcode】剑指 Offer 15. 二进制中1的个数
剑指 Offer 15. 二进制中1的个数分析这题能用很多种办法做出来,但没意义浪费时间。除N取余法python自带转换法递归法除N取余法class Solution: def hammingWeight(self, n: int) -> int: return self.chu_N_quyu(n) def chu_N_quyu(self, n): res = 0 while n: res +=
2022-01-04 11:22:15 725
原创 【leetcode】剑指 Offer 14- II. 剪绳子 II
剑指 Offer 14- II. 剪绳子 II分析跟上个题目一样,继续dp就行。只不过题目要求模一个数。动态规划法class Solution: def cuttingRope(self, n: int) -> int: dp = [1 for i in range(n+1)] for i in range(3, n+1): border = i//2 for j in range(1, border+1)
2022-01-04 11:03:08 159
原创 【leetcode】2022.1.4猫和老鼠
913. 猫和老鼠分析hard题,而且是个三维dp题。所以还是看官方题解吧,我讲的肯定没有官方题解好理解。官方题解长这样:动态规划法DRAW = 0MOUSE_WIN = 1CAT_WIN = 2class Solution: def catMouseGame(self, graph) -> int: n = len(graph) dp = [[[-1] * (n * 2) for _ in range(n)] for _ in ra
2022-01-04 10:53:51 594
原创 【leetcode】剑指 Offer 14- I. 剪绳子
剑指 Offer 14- I. 剪绳子这种无穷无尽的题,只能通过递归or动态规划的方式来解决。有大佬用贪心法做出来的,但我理解不了,就不给自己找不自在了。用动态规划做出来也挺好的。分析这题,分析一下,意思是我们至少要剪掉一次绳子。咦,剪掉绳子,岂不是就是相当于缩小了问题规模?是的没错。说干就干。先搞一个转移方程。其中dp[i]是长度为i的绳子剪断后能得到的最大乘积。dp[3] = dp[1] + dp[2]dp[4] = max(dp[1]+dp[3], dp[2]+dp[2])dp[5] =
2022-01-03 16:20:20 218
原创 【leetcode】2022.1.3一周中的第几天
一周中的第几天分析我们知道了输入范围最早是1971年。那么我们得知1970年12月31日是周几,然后计算出来给定时间和1970年12月31日差几天,根据这个天数模7即可。模拟法class Solution: def dayOfTheWeek(self, day: int, month: int, year: int) -> str: return self.get_days(year, month, day) def get_days(self, year, m
2022-01-03 15:26:32 709
原创 【leetcode】剑指 Offer 13. 机器人的运动范围
剑指 Offer 13. 机器人的运动范围分析这题和之前做过的12有不同之处。12是可以从每一个点遍历,而本题只能从原点遍历。注意,这题的关键之处在于求和。把上下左右的和都加起来,这才是真正的和。DFS法class Solution: def movingCount(self, m: int, n: int, k: int) -> int: return self.dfs(m, n, 0, 0, k, 0, set()) def dfs(self, m, n,
2022-01-03 14:53:27 207
原创 【leetcode】2022.1.2 消除游戏
390. 消除游戏分析这题看完像是抓住了什么,但又像啥也没抓住。当没有思路的时候,最好的解题思路就是先用最暴力最弱智的办法把它做出来,然后再进行优化。暴力模拟法 - 真的弄出来个数组,按照他的规则不断的去筛掉其中不符合条件的值,如果剩下的数组长度为1,代表我们找到了目标元素。这种办法肯定会超时的。数学分析法 - 分析暴力模拟法的思维过程。对于某个数组,我们肯定会先杀掉1,3,5等奇数,然后要分析剩下的数组长度是不是奇数,如果是,证明第一个元素会被干掉,跟第一趟算法是一样的。暴力模拟法cla
2022-01-02 21:59:54 2313
原创 【leetcode】2022.1.1 将一维数组转变成二维数组
2022. 将一维数组转变成二维数组2022每日一题,希望能讨个好彩头。冲啊!做最靠谱的工程师!分析这题其实做个模拟就很容易搞定了。就是不断的切割一维数组,搞成二维的。别忘了异常的处理。解法class Solution: def construct2DArray(self, original: List[int], m: int, n: int) -> List[List[int]]: return [original[i*n:(i+1)*n] for i in
2022-01-01 23:29:10 497
原创 【leetcode】剑指 Offer 12. 矩阵中的路径
剑指 Offer 12. 矩阵中的路径分析其实就是个深度优先搜索。可以设置一个visit数组,标记已经走过的路段。注意判断dfs的退出条件。写递归就是这样,先想好退出条件,再不断的缩小问题规模,就这样。深度优先搜索法class Solution: def exist(self, board: List[List[str]], word: str) -> bool: if len(board) == 0 or len(board[0]) == 0: return wor
2022-01-01 23:12:30 293
原创 【leetcode】剑指 Offer 11. 旋转数组的最小数字
剑指 Offer 11. 旋转数组的最小数字分析题意说了是有序数组的旋转,那就代表可以用二分法。遍历法 - 一次遍历,找出来右侧的值小于左侧值,即为最小值。如果找不到,那代表这是个非递减数组,直接返回第一个值即可。二分法 - 根据二分法,找到最小值并返回即可。-二分法有限制。 在二分的时候,要想清楚对于哪些情况应该drop哪边。 二分的核心是drop。具体题解看这里遍历法class Solution: def minArray(self, numbers: List[int])
2022-01-01 23:09:22 187
原创 【python -m】详解
普通模块应用以“.py”为后缀的文件就是一个模块,在“-m”之后使用时,只需要使用模块名,不需要写出后缀,但前提是该模块名是有效的,且不能是用 C 语言写成的模块。对于一个普通模块,有时候这两种写法表面看起来是等效的:两种写法都会把定位到的模块脚本当成主程序入口来执行,即在执行时,该脚本的 __name__ 都是”__main__“,跟 import 导入方式是不同的。但是,这只是看起来等效,实际是不等效的。Look一下:(venv) weitonghui:learnSklearn vth$ p
2021-12-30 11:43:46 1693
原创 Unittest使用
0x00 忠告别写啥都用pycharm,在没有熟悉一门语言之前就用IDE对学习没有半点好处。所以本教程用命令行来搞。(Pycharm也有terminal)首先明确几个概念。unittest测试框架包含测试用例、测试套件、测试夹具、测试发现器、测试执行器。0x01 开始 - 测试用例# main.pyimport unittestclass TestStringMethods(unittest.TestCase): def test_upper(self): sel
2021-12-30 10:40:52 247
原创 Unittest源码阅读
入口unittest测试框架,入口是unittest.main()。但,在用unittest之前,必然会导入unittest,自动执行其init文件中的代码。所以第一步先看导入unittest框架后,init做了什么。我们发现init做了这个事儿:from .result import TestResultfrom .case import (addModuleCleanup, TestCase, FunctionTestCase, SkipTest, skip,
2021-12-29 11:44:04 937
原创 【leetcode】剑指 Offer 10- II. 青蛙跳台阶问题
剑指 Offer 10- II. 青蛙跳台阶问题分析根据题意,在第0级时还没跳,应当设置为1.在第一级台阶上,只能从第0级台阶跳1步过来。第二级台阶上,可以从第0级跳2步过来,也可以从第1级跳一步过来。故,第N级台阶可以从第N-1级台阶和第N-2级台阶过来。设跳到第N级台阶有f(N)种方法,那f(N) = f(N-1) + f(N-2)动态规划法class Solution: def numWays(self, n: int) -> int: if n == 0
2021-12-24 15:12:27 630
原创 【leetcode】剑指 Offer 10- I. 斐波那契数列
剑指 Offer 10- I. 斐波那契数列分析斐波那契数列。我有100种办法可以解决(装个逼)。递归法。打表法(动态规划-记忆化搜索,咋叫都行)。循环法(其实就是打表法的升级,因为打表法只关心前两个元素的值)。递归法class Solution: def fib(self, n: int) -> int: if n < 2: return n return self.fib(n-1) + self.fib(n-2
2021-12-24 10:19:39 421
原创 【leetcode】剑指 Offer 09. 用两个栈实现队列
剑指 Offer 09. 用两个栈实现队列分析两个栈当成一个队列玩。栈是后入先出,队列是先入先出。如果把一个栈的数据,倒入到另外一个空栈中,那就会形成一个队列。为啥非得是空栈?假如有A、B两个栈来模拟队列。我们要保证入队操作只入A栈,然后在恰当的时机把A栈中的东西倒入B栈。也就是说,B栈的栈顶要求始终是队头。如果B栈不为空时A栈就倒入了B栈,那么B栈的栈顶就不是队头了。所以我们写代码要做到的就是控制A栈倒入B栈的时机是B栈为空时。解决方案class CQueue: def _
2021-12-24 09:59:41 597
原创 【leetcode】剑指 Offer 07. 重建二叉树
剑指 Offer 07. 重建二叉树分析给先序遍历和中序遍历,建树。先序遍历是:根-左-右。中序遍历是:左-根-右。所以根据先序遍历可以确认根的位置。根据根的值,可以确定中序遍历左子树的范围。根据左子树的范围可以确定先序遍历左子树的范围。 根据以上可以得到右子树的范围。然后递归的建立左子树和右子树即可。记住,涉及到树,递归就对了!递归法class Solution: def buildTree(self, preorder, inorder): if len(pr
2021-12-23 20:20:37 210
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人