一、力扣
1、对角线遍历
class Solution {
public int[] findDiagonalOrder(int[][] mat) {
int m = mat.length;
int n = mat[0].length;
int[] res = new int[m * n];
int pos = 0;
// 遍历所有对角线,总共有 m + n - 1 条对角线
for (int i = 0; i < m + n - 1; i++) {
if (i % 2 == 1) { // 奇数层:从下往上遍历(右上到左下)
// 计算当前对角线的起始坐标
int x = (i < n) ? 0 : i - n + 1; // 起始行:若i小于列数则从第0行开始,否则从i-n+1行
int y = (i < n) ? i : n - 1; // 起始列:若i小于列数则从第i列开始,否则从最后一列开始
// 沿对角线向上遍历,直到越界
while (x < m && y >= 0) {
res[pos++] = mat[x][y];
x++; // 向下移动一行
y--; // 向左移动一列
}
} else { // 偶数层:从上往下遍历(左下到右上)
// 计算当前对角线的起始坐标
int x = (i < m) ? i : m - 1; // 起始行:若i小于行数则从第i行开始,否则从最后一行开始
int y = (i < m) ? 0 : i - m + 1; // 起始列:若i小于行数则从第0列开始,否则从i-m+1列开始
// 沿对角线向下遍历,直到越界
while (x >= 0 && y < n) {
res[pos++] = mat[x][y];
x--; // 向上移动一行
y++; // 向右移动一列
}
}
}
return res;
}
}
2、二叉树的完全性检验
class Solution {
public boolean isCompleteTree(TreeNode root) {
// 创建一个双端队列用于层序遍历
Deque<TreeNode> deque = new LinkedList<>();
deque.offer(root);
// 标记是否遇到了空节点
boolean flag = true;
while (!deque.isEmpty()) {
// 从队列尾部取出一个节点
TreeNode node = deque.poll();
if (node == null) {
// 如果遇到空节点,则设置标志为false
flag = false;
} else {
// 如果在非空节点前出现了空节点,则树不是完全二叉树
if (!flag) {
return false;
}
// 将当前节点的左右子节点加入队列头部
deque.offer(node.left);
deque.offer(node.right);
}
}
// 如果遍历完成没有发现违规情况,则树是完全二叉树
return true;
}
}
二、语雀-Kafka
1、✅Kafka 几种选举过程简单介绍一下?
2、为什么Kafka没办法100%保证消息不丢失?
3、Kafka 消息的发送过程简单介绍一下?
4、Kafka 高水位了解过吗?为什么 Kafka 需要 Leader Epoch
✅Kafka 高水位了解过吗?为什么 Kafka 需要 Leader Epoch?
5、Kafka 为什么有 Topic 还要用 Partition?
✅Kafka 为什么有 Topic 还要用 Partition?