LC.P450[删除二叉搜索树中的节点]
LC.P450[删除二叉搜索树中的节点]
方法一:从当前节点的左子树中选择值最大的节点代替root123456789101112131415161718192021222324252627282930313233/** * Definition for a binary tree node. * public 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; * } * } */class Solu ...
LC.P2511[最多可以摧毁的敌人城堡数目]
LC.P2511[最多可以摧毁的敌人城堡数目]
方法一:双指针12345678910111213141516class Solution { public int captureForts(int[] forts) { int ans = 0, n = forts.length; for (int i = 0; i < n; ) { int j = i + 1; if (forts[i] != 0) { while (j < n && forts[j] == 0) ++j; if (j < n && forts[i] + forts[j] == 0) { ans = Math.max(ans, j - i - 1); } } ...
LC.P2240[买钢笔和铅笔的方案数]
LC.P2240[买钢笔和铅笔的方案数]
方法一:枚举12345678910class Solution { public long waysToBuyPensPencils(int total, int cost1, int cost2) { long ans = 0; for (int x = 0; x <= total / cost1; ++x) { int y = (total - x * cost1) / cost2 + 1; ans += y; } return ans; }}
时间复杂度:$O(total/cost1)$
空间复杂度:$O(1)$
SpringBoot项目实现数据脱敏
SpringBoot项目实现数据脱敏
通常情况下,将敏感信息如手机号、身份证等脱敏后存储在数据库是更安全的做法,同时在返回给前端时进行必要的脱敏处理,脱敏过程主要分为两步:
存储时脱敏: 将手机号等敏感信息在存储到数据库之前进行脱敏处理,以确保即使数据库遭到未授权访问,也不会直接暴露真实的敏感信息。脱敏后的数据仍然保留了结构,但敏感部分已经被替换或加密。这样做可以最大程度地保护用户隐私。
返回给前端时脱敏: 当从数据库中获取数据用于前端展示时,可以将数据再次进行脱敏,以保护终端用户的隐私。这意味着前端界面上显示的数据不会包含真实的敏感信息。例如,只显示部分号码、隐藏中间几位数字,或者用星号(*) 替代一部分数字。
需要注意的是,脱敏并不意味着所有情况下都是安全的。在某些情况下,即使脱敏后的数据也可能被攻击者通过各种方法还原或破解。因此,在进行数据脱敏时,需要综合考虑具体的安全需求、法规合规性以及技术实施的可行性。
最终的选择可能会受到具体情况的影响,比如所在行业的法规要求、隐私政策、数据使用场景等。在实施数据脱敏时,最好的做法是与安全专家和法律顾问合作,确保采取的措施符合最佳安全实践和 ...
SpringBoot+Mybatis配置自动填充字段拦截器
SpringBoot+Mybatis配置自动填充字段拦截器
在项目开发中,基本都会有creator(创建者),create_time(创建时间),updater(更新者),update_time(更新时间)等这些固定字段需要设置,而这些字段的值又有一定的共性,每次手动设置就显得不够优雅。一个较好的解决方案是通过配置Mybatis的拦截器+注解的方式,实现通用字段(可根据项目需求修改下文中的字段)的自动填充。
创建相关注解createBy.java
12345678910import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.FIELD})public @interface CreateBy ...
LC.P1761[一个图中连通三元组的最小度数]
LC.P1761[一个图中连通三元组的最小度数]
方法一:暴力枚举1234567891011121314151617181920212223242526class Solution { public int minTrioDegree(int n, int[][] edges) { boolean[][] g = new boolean[n][n]; int[] deg = new int[n]; for (int[] e : edges) { int a = e[0] - 1, b = e[1] - 1; g[a][b] = true; g[b][a] = true; ++deg[a]; ++deg[b]; } int ans = Integer.MAX_VALUE; for (int i = 0; i < n; ++i) { ...
LC.P2045[到达目的地的第二短时间]
LC.P2045[到达目的地的第二短时间]
方法一:BFS123456789101112131415161718192021222324252627282930313233343536373839class Solution { public int secondMinimum(int n, int[][] edges, int time, int change) { List<Integer>[] g = new ArrayList[n + 1]; Arrays.setAll(g, k -> new ArrayList<>()); for (int[] e : edges) { g[e[0]].add(e[1]); g[e[1]].add(e[0]); } // path[i][0] 表示从 1 到 i 的最短路长度,path[i][1] 表示从 1 到 i 的严格次短路长度 int ...
LC.P743[网络延迟时间]
LC.P743[网络延迟时间]
方法一:Dijkstra123456789101112131415161718192021222324252627282930313233343536class Solution { private static final int INF = 0x3f3f3f3f; public int networkDelayTime(int[][] times, int n, int k) { int[][] g = new int[n][n]; for (int[] e : g) { Arrays.fill(e, INF); } for (int[] t : times) { int a = t[0] - 1, b = t[1] - 1, w = t[2]; g[a][b] = w; } int[] dist = new int[n]; ...
LC.P1654[到家的最少跳跃次数]
LC.P1654[到家的最少跳跃次数]
方法一:BFS12345678910111213141516171819202122232425262728293031323334class Solution { static final int n = 6000; public int minimumJumps(int[] forbidden, int a, int b, int x) { Set<Integer> set = new HashSet<>(); for (int f : forbidden) set.add(f); Deque<int[]> queue = new ArrayDeque<>(); queue.offer(new int[]{0, 1}); boolean[][] visited = new boolean[n][2]; visited[0][1] = true; ...
LC.P698[划分为k个相等的子集]
LC.P698[划分为k个相等的子集]
方法一:回溯+剪枝1234567891011121314151617181920212223242526272829303132class Solution { int[] nums; boolean[] visited; int n, target, k; public boolean canPartitionKSubsets(int[] nums, int k) { int total = 0; for (int num : nums) total += num; if (total % k != 0) return false; this.nums = nums; n = nums.length; this.k = k; Arrays.sort(nums); visited = new boolean[n]; target = total / k; r ...