leetcode652-寻找重复的子树-序列编号
原题链接:https://leetcode.cn/problems/find-duplicate-subtrees/对于每一种子树以一个三元组进行编号(node.val,l,r) —> (node,idx)node.val为节点的值 l,r 为左右子树的编号node 为节点 idx为该节点的编号这样当我们每发现一种新的子树 那么就给这个子树编号 否则就将该子树 加入结果 与相同的共用一个编号
1234567891011121314151617181920212223242526272829303132333435363738# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: def findDuplicateSubtrees(s ...
leetcode1345-跳跃游戏-bfs优化问题
原题链接:https://leetcode.cn/problems/jump-game-iv/这题基本思路比较BFS 每次扩展 i-1,i+1,值与arr[i]相同的点但这题数据范围为5 * 10^4 如果arr[i]相等的边有m条 那么由于是一个无向图 那么这样的遍历的将会n^2 次 所以这一步是优化的关键优化的思路是 是使用bfs 求最短路的路径 bfs求最短路只有第一次更新时求出的值是最小值 所以当你一次扩展值均为v的点后 直接删除v即可 下一次不必再遍历 即对于相同值得所有点只走一遍
1234567891011121314151617181920212223242526272829303132333435363738class Solution: def minJumps(self, arr: List[int]) -> int: # 先记录所有与值相同点的下标 h = defaultdict(list) for i, v in enumerate(arr): h[v].append(i) ...
开发-安全可靠登录流程的实现
对于一个网站来说 用户登录为第一步 也是最关键的步骤之一 用户登录的过程中会提交自己的用户名以及密码与后台数据库进行核验
然而随着现在网络的发展 网络安全问题也日益突出 保证用户登录过程中的信息安全至关重要
我在我的毕业设计关于这个问题 也思考了许多解决办法 现在将其总结于此
用户的登录流程首先我们分析仪一下用户最基本的登录流程及其可能存在的问题 及相应的解决方案 :
1.用户进入登录页面输入自己的用户名和密码
这个过程可能存在的问题的是 恶意的密码尝试 比如有脚本恶意尝试密码 企图登录系统
解决这种问题的方法是采用验证码 同时将验证码存入redis中还可以设置过期时间进一步增强安全性
2前端获取用户输入将其传到后端
在前端向后端传递密码过程的过程 通常是将密码信息加在http post请求中发送给后端 而这个post请求是可以抓包
解决这种问题的方法是在将密码传输 如使用前端使用rsa算法用公钥加密后 再将加密后的密码传输至后端用私钥解密
3后端调用相应service 进行校验 返回结果给前端
4网页存储用户的登录状态 从而用户可以自己的身份信息访问网页 ...
leetcode1346检查整数及其两倍数是否存在-一题多解
个人认为很好的一道面试题虽然题目简单但如果直接暴搜的话应该就直接回家等通知了有好几种做法面试的时候都可以说一下
法1: 二分排序后 遍历数组 二分查找是否存在二倍的值复杂度:排序 nlogn 二分 n * lognO(nlogn)
1234567891011121314151617from typing import Listfrom bisect import *class Solution: def checkIfExist(self, arr: List[int]) -> bool: arr.sort() n = len(arr) for i in range(n): v = arr[i] index = bisect_left(arr,2*v) if index >= n or index == i: continue if 2*v == arr[index]: retu ...
leetcode6163给定条件下构造矩阵-拓扑排序
拓扑排序 代码实现思路: 1. 入队所有入度为0 的点 2. bfs 取出队头t 枚举t的所有出边 t->j 3. 删掉 t->j 即让 d[j]– (d[j] j的入度) 4. if d[j] == 0 -> 说明j之前所有点均以排好序 -> j 入队 5. 如果图中存在环则无法全部入队 反之则都可以入队
先看一个基础点的题leetcode 210 原题链接:https://leetcode.cn/problems/course-schedule-ii/算是一道经典题
12345678910111213141516171819202122232425262728class Solution: def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]: n = numCourses de ...
初出茅庐-我的第一次实习经历
2022.2 - 2022.4 天翼阅读文化动笔时已经是已经快要开学 而我也将马上进入下一个阶段 研究生的学习了 也是时候为之前的实习做一个记录与总结
拿到offer的过程比较意外 但也比较幸运 记录于 面试记录2022-2天翼阅读文化公司是在武林广场 杭州市中心的位置 当时三号线还没开 只能靠193 最开始采取的策略是 一开始想到解决办法是 周一早上193路到公司 然后工作日住旁边宾馆的 然后最后一个工作日晚上回学校 住宾馆虽然比较舒服也确实很方便 但感觉花销还是太大了 而且也和一个一直有联系高中同学交流 刚好他也在实习在九堡那里租了一间房子或者说鸽笼比较合适一些 然后就搬到他那边 这在九堡生活的这段经历也算是迷茫与辛苦交织中却也带着一些快乐 毕竟能有一个分享生活的人在一起感觉就会好很多
住的地方离地铁口大概15分钟左右的路 但是从九堡到武林广场算上出入站的等车的时间大概要花上个40分钟左右甚至更多 我是9.30–5.30当然这是在没有特殊情况不需要加班处理的情况下 看上去8小时工作制蛮不错 但算上上下班的时间 还有早晚饭 以及洗漱的时间 我基本每天早上要7.40左右起来才能比较 ...
python语法在竞赛中的巧妙应用
python 的语法笔记使用python 实现字典与列表的嵌套类似于C++中
12vector<vector<int>>h1;unordered_map<int,vector<int>>h2;
python 虽然不能像C++ 这样实现无限套娃 也基本足够 即可可实现 int:list 即一个整数 或 字符/字符串 对应的列表 在建图的时候 会非常方便 但在构造题中还是直接上C++ 的 unordered_map 会舒服一些
12345678"""这个是需要引入的 如果是写一些oj 或者 kickstart 就要注意一下但在leetcode中 整个collections 集合都是 自动帮我们引入好的直接 而且还是这种 from import的形式 所以直接用defaultdict就OK了"""from collections import defaultdicth = defaultdict(list)h[0].append(0)h[1].append(0)
pyth ...
leetcode172阶乘后的零-分解质因子
原题链接:https://leetcode.cn/problems/factorial-trailing-zeroes/
想要一个数的结尾多加一个0 最直观的想法就是 * 10 而10 又可以拆解为 2 * 5 也就是说每多一对 2 * 5 就会多一个10 就会多一个0 所以题目转化求 每一个数中的2和5 的数量 有多少对2 5 则结果在就会尾随多少个0进一步优化-> 由于题目求的是0-n的中数的5 那么有5 就一定会有2 也就是说 只要算出5的个数即可
12345678910class Solution: def trailingZeroes(self, n: int) -> int: ans = 0 for i in range(5,n + 1,5): while i % 5 == 0: i//=5 ans = ans + 1 return ans
进一步优化-> 由于0-n中 可能存在前面的数是后面的数的因子 ...
leetcode2376数位dp
原题链接:https://leetcode.cn/problems/count-special-integers/
数位dp 虽然只要是枚举的过程 但需要考虑的情况比较多 且融合非常多的知识点 非常细致主要需要注意以下几个点:
枚举过的数 不能再枚举 可以用一个vis数组 但为了方便可以用二进制的方法 采用一个mask 进行解决
每个位置枚举的数 会受到前一个位置的限制
比如说 n=123 那么如果 当前已经枚举的情况位 12_ 那么最后一位只能枚举1 2 3 否则就会超过123 那么生成的数 就不符合答案标准了
如果前一个数位为0 那么当前位置枚举数可能会存在重复
比如说 9 09 009 则三个数都会出现重复 需要这种特殊情况进行判读那
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758class Solution: def countSpecialNumbers(self, n: i ...
算法模板-循环双端队列
循环队列概念很早接触了 但在细节方面一直有些迷糊正好今天的每日一题是循环队列 总结了一下关键以下两点:1.对于front 和 rear的定义要明确
font指向的是队头有效元素的位置 而rear则指向的是队尾下一个有效元素的位置 这就导致一些差异
最主要的就是进行队尾插入时 要先进行赋值 q[rear] = value 而后移动rear 指针 因为根据rear指针的定义之前rear指针所指向的位置 正是此时元素应该插入的有效位置
然后根据rear 定义 那么返回队尾元素时 返回应该时rear-1这个位置的元素 而并非rear2.空出一个有效位置作为哨兵 主要是为了区分队空和队满两种状态
这和rear指针的定义是紧密关联的
当 (rear + 1 % capacity) == front 代表 此时队列已满 可以这样理解 rear 代表下一个元素的有效位置 即下一个元素的有效位置已经是front了那么这样就代表队满了
同时根据上述定义 真正队满是 front != rear 所以队空的情况只能是 front = ...