算法学习总结–
labuladong 书的总结。 书本身并不难吧 套路也是 有用或没用。
一步一步来。 熟能生巧。-- 2022-09-05
Java 基础数据结构
数组
String
ArrayList 。 双向链表 LinkedList
HashMap :基本方法。HashSet。Queue . Stack
所谓套路
LeetCode 124 二叉树的最大路径和:
/**
* LeetCode 124 二叉树的最大路径和
* 本题难点: 最大路径和 不一定过 根结点。
* 即是 路径的定义 这一问题。
* <p>
* TODO: 思考最大的路径不一定过根结点 所以再每一个有子节点的父节点 都要做一下求和。
* TODO 遍历所以之后 就可以找到最大值。 这也是为什么
*/
private int pathLength = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
maxPath(root);
return pathLength;
}
public int maxPath(TreeNode root) {
if (root == null) {
return 0;
}
int left = Math.max(0, maxPath(root.left));
int right = Math.max(0, maxPath(root.right));
pathLength = Math.max(pathLength, right + left + root.val);
return root.val + Math.max(root.left.val, root.right.val);
}
回溯框架
动态规划框架:
最长递增子序列。
最小编辑距离。
凑零钱问题:
设计事务事实表
选择业务过程------声明粒度—确认维度—确认事实
粒度 找最细粒度。 每天 的库存 累积 不等于每个月的库存。 度量一定可加么?? 不一定。
数据调研----- 明确数据域—>>>> 构建业务总线矩阵------>>>>>.维度模型设计---- 开发-----调度
明确统计指标---->>>>> 汇总模型设计
指标:
原子指标-- 订单总金额
派生指标— 最近一天 各个省份手机品类订单总金额。 =原子指标+ 统计周期+业务限定+统计粒度。
衍生指标-----
原子指标: 不可以拆分。
派生:原子基础上 增加。
衍生: 一个或多个派生指标基础上 各种聚合逻辑 复合而成。 比率 比例等。
分层设计:
ODS :Kafka pulsar。
DWD: 日志分流。
DIM:常驻数据一般不用Redis
DWS 轻度汇总 窗口汇总
维度数据:
事实表 和维度表分流。
读取MySQL的配置数据—>>传统的 MaxWell 得到历史数据和全量数据。
或者CDC 连接器
JDBC 只能读取全量。
IDEA +Flink 环境
排序 和异或运算
排序
异或 运算理解为无进位 相加。
异或满足交换律。 与先后顺序无关。
数组中异或:两个位置 i!=j 不相同。
异或: 一种数出现了奇数次 其他数出现了偶数次。
两种数出现了奇数次。其他数出现了偶数次。
/**
* 一种数出现了奇数次 其他数出现了偶数次。
*
* @param arr
*/
public static void printOddTimesNum1(int[] arr) {
int eO = 0;
for (int cur : arr) {
eO ^= cur;
}
System.out.println(eO);
}
/**
* 2种数出现了奇数次 其他数出现了偶数次。
*
* @param arr
*/
public static void printOddTime2Num2(int[] arr) {
int e0 = 0, ehasOne = 0;
for (int curNum : arr) { // 最终结果是 两数异或。 一定在某一位不等于0.
e0 ^= curNum;
}
int right = e0 & (~e0 + 1); //最后一位不是1的数是哪一位。
for (int cur : arr) {
if ((cur & right) != 0) {
ehasOne ^= cur;
}
}
System.out.println(ehasOne + "" + (e0 ^ ehasOne));
}
}
提取最低位的1
n&-n 或 n&(~n+1)