面试必考:矩阵、二进制、位运算、LRU算法题,你能全掌握吗?

摘要:Attention 秋招接近尾声,我总结了 、`WanAndroid` 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对、测试。欢迎食用 本文将覆盖 「二进制」 &#x2B
Attention 秋招接近尾声,我总结了 牛客、WanAndroid 上,有关笔试面经的帖子中出现的算法题,结合往年考题写了这一系列文章,所有文章均与 LeetCode 进行核对、测试。欢迎食用 本文将覆盖 「二进制」 + 「位运算」 和 Lru 方面的面试算法题,文中我将给出: 面试中的题目 解题的思路 特定问题的技巧和注意事项 考察的知识点及其概念 详细的代码和解析 开始之前,我们先看下会有哪些重点案例: 为了方便大家跟进学习,我在 GitHub 建立了一个仓库 仓库地址:超级干货!精心归纳视频、归类、总结,各位路过的老铁支持一下!给个 Star ! 现在就让我们开始吧! 矩阵 螺旋矩阵 给定一个包含 m x n 个要素的矩阵,(m 行, n 列),按照螺旋顺序,返回该矩阵中的所有要素。 示例 : 输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出: [1,2,3,4,8,12,11,10,9,5,6,7] 解题思路 我们定义矩阵的第 k 层是到最近边界距离为 k 的所有顶点。例如,下图矩阵最外层元素都是第 1 层,次外层元素都是第 2 层,然后是第 3 层的。 [[1, 1, 1, 1, 1, 1, 1], [1, 2, 2, 2, 2, 2, 1], [1, 2, 3, 3, 3, 2, 1], [1, 2, 2, 2, 2, 2, 1], [1, 1, 1, 1, 1, 1, 1]] 对于每层,我们从左上方开始以顺时针的顺序遍历所有元素,假设当前层左上角坐标是 \(\text{(r1, c1)}\),右下角坐标是 \(\text{(r2, c2)}\)。 首先,遍历上方的所有元素 (r1, c),按照 c = c1,...,c2 的顺序。然后遍历右侧的所有元素 (r, c2),按照 r = r1+1,...,r2 的顺序。如果这一层有四条边(也就是 r1 < r2 并且 c1 < c2 ),我们以下图所示的方式遍历下方的元素和左侧的元素。 public List<Integer> spiralOrder(int[][] matrix) { ArrayList<Integer> rst = new ArrayList<Integer>(); if(matrix == null || matrix.length == 0) { return rst; } int rows = matrix.length; int cols = matrix[0].length; int count = 0; while(count * 2 < rows && count * 2 < cols){ for (int i = count; i < cols - count; i++) { rst.add(matrix[count][i]); } for (int i = count + 1; i < rows - count; i++) { rst.add(matrix[i][cols - count - 1]); } if (rows - 2 * count == 1 || cols - 2 * count == 1) { // 如果只剩1行或1列 break; } for (int i = cols - count - 2; i >= count; i--) { rst.add(matrix[rows - count - 1][i]); } for (int i = rows - count - 2; i >= count + 1; i--) { rst.add(matrix[i][count]); } count++; } return rst; } 判断数独是否合法 请判定一个数独是否有效。该数独可能只填充了部分数字,其中缺少的数字用 . 表示。
阅读全文