HashMap的遍历方式
HashMap的遍历方式EntrySet遍历KeySet遍历
常见设计模式总结
常见设计模式总结
Spring中和JAVA IO中就涉及到设计模式,具体包括以下几个:
工厂模式单例模式双重锁检查法单例模式
策略模式装饰器模式装饰器模式是指在不改变原有对象的情况下扩展功能。
LeetCode Hot100题解
哈希1、两数之和123456789101112131415class Solution { public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); int[] res = new int[2]; for (int i = 0; i < nums.length; i++) { if (map.containsKey(target - nums[i])) { res[0] = i; res[1] = map.get(target - nums[i]); return res; } map.put(nums[i], i); } return res; ...
堆
堆堆堆是一种基于树结构的数据结构,具有高效的插入和删除操作。
堆本质是完全二叉树,常用的两种堆分别是:
最大堆:父节点的值小于或等于其子节点的值
最小堆:父节点的值大于或等于其子节点的值
堆通常用于实现优先队列或者堆排序等算法
1234567891011121314import heapq# 创建最小堆heap = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]heapq.heapify(heap)# 插入元素heapq.heappush(heap, 0)# 弹出最小元素min_element = heapq.heappop(heap)print("Min Heap:", heap)print("Min Element:", min_element)
优先队列/堆堆排序
前缀和整理
前缀和
2024年3月9日美团笔试 前缀和 * 1
2024年3月13日 携程笔试 前缀和 * 1
练习题2602、使数组元素全部相等的最少操作次数
本题类似于携程的笔试题,暴力算法的时间复杂度为O(n²),n=10^5,铁超时
12345678910class Solution: def minOperations(self, nums: List[int], queries: List[int]) -> List[int]: res = [] for q in queries: operation = 0 for i in range(len(nums)): operation += abs(nums[i]-q) res.append(operation) return res
正确思路:
前缀和+二分查找
构造前缀和:
12345678910111213class Solution: def minOperation ...
树与二叉树(Java版本)
树与二叉树二叉树的结构123456789101112public class TreeNode{ int val; TreeNode left; TreeNode right; TreeNode(){} TreeNode(int val){this.val = val} TreeNode(int val, TreeNode left, TreeNode right){ this.val=val; this.left = left; this.right = right; }}
二叉树的递归遍历算法先序遍历【递归】1234567891011121314151617class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); preorder(root ...
图论
图论在图论中,主要的遍历方法就是深度优先搜索和广度优先搜索
图的存储方式主要有以下两种:
邻接矩阵(二维数组)
邻接表
深度优先搜索DFS深搜三部曲
1、确定递归函数和参数
2、确定终止条件
3、处理目前搜索节点出发的路径
代码框架12345void dfs(参数) { 处理节点 dfs(图,选择的节点); // 递归 回溯,撤销处理结果}
1234567891011direction = [(1, 0), (-1, 0), (0, 1), (0, -1)]def dfs(grid, visited, x, y): for dx, dy in direction: nextx = x + dx nexty = y + dy if nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]): continue if not visited[nextx][ne ...
滑动窗口问题
滑动窗口问题滑动窗口主要解决子数组或者子串问题,其优点是可以避免暴力算法导致的O(n²)的时间复杂度,降低时间复杂度到O(n)。
滑动窗口的代码模板如下:
123456789101112131415161718192021222324252627282930313233343536# 滑动窗口算法框架def slidingWindow(s: str): # 用合适的数据结构记录窗口中的数据,根据具体场景变通 # 比如说,我想记录窗口中元素出现的次数,就用 map # 我想记录窗口中的元素和,就用 int window = dict() left = 0 right = 0 while right < len(s): # c 是将移入窗口的字符 c = s[right] window[c] = window.get(c, 0) + 1 # 增大窗口 right += 1 # 进行窗口内数据的一系列更新 #... #/** ...
为什么Cookie无法防止CSRF攻击而Token可以?
为什么Cookie无法防止CSRF攻击而Token可以?CSRF介绍CSRF(Cross Site Request Forgery):跨站请求伪造,属于网络攻击领领域范畴。相比于SQL脚本注入、XSS攻击等安全攻击方式,CSRF的知名度并没有他们高,但是它确实是我们开发系统时必须要考虑的安全隐患。
什么是CSRF呢?
简单来说,就是黑客利用你的身份信息去做一些非法的事情,例如将你的钱转走、发邮件、发消息等
CSRF攻击需要依赖于Cookie,Session
Cookie中会存放SessionID,
CSRF攻击流程流程:
客户端通过账户密码登录访问网站A
网站A验证客户端的账号密码,成功则生成一个sessionID,并返回给客户端存储在浏览器中
该客户端Tab一个新页面访问了网站B
网站B自动触发要求该客户端访问网站A(网站B中有链接指向网站A)
客户端通过网站B中的链接访问网站A(此时携带有合法的SessionID进行访问站A)
此时网站A只需要校验sessionID是否合法,若合法则执行相应的操作
防御方法防御CSRF攻击的方法:
在请求地址中添加token并验证
验证 HT ...
八股整理
1.redis的集群模式
2.redis的持久化策略
3.内存淘汰策略
4.redis hash的底层结构
5.redis string底层结构
6.redis实现分布式锁,以及setnx可能存在的问题
7.spring和springboot的区别
8.springboot注入类有哪些注解,有什么区别
9.spring aop如何实现
10.动态代理有几种实现方式
11.mybatis #和$的区别
12.mysql如何选择建立哪些索引
13.mysql为什么用b+树
14.mysql有哪些锁
15.https中用到了哪些加密算法
16.tcp的粘包问题
17.linux如何查看文件
18.java锁的可重入和公平性
19.java线程的生命周期
20.wait和sleep的区别
21.什么是死锁,如何用java写个死锁
22.jvm的内存模型
23.年轻代垃圾回收算法
24.树的遍历
25.一致性哈希算法
26.编程题,字符串匹配,说可以直接暴力
二面
1.介绍部门业务
2.拷打项目
3.数据库事务的特性
4.如何实现持久性
5.binlog和redolog的区别
6.undolog ...