Skip to content

以下是一些安卓面试中常见的算法题类型及简要思路:


1. 数组/字符串类

两数之和

  • 思路:使用哈希表,遍历时查找 target - num 是否在表中,存在则返回下标,否则存入当前数字和下标。
  • 变种:三数之和(排序+双指针)、合并区间(排序后遍历合并)。

2. 链表类

反转链表

  • 思路:迭代法用三个指针(prev, curr, next)逐步反转;递归法先递归到末尾,再反转指针。
  • 常见题:检测环(快慢指针)、合并两个有序链表(双指针比较)。

3. 二叉树类

二叉树层序遍历

  • 思路:队列实现 BFS,每层遍历时记录节点值。
  • 常见题:求最大深度(递归或BFS)、判断对称二叉树(递归比较左右子树)。

4. 动态规划

爬楼梯问题

  • 思路dp[i] = dp[i-1] + dp[i-2],类似斐波那契数列,可用滚动数组优化空间。
  • 常见题:最长递增子序列、背包问题。

5. 搜索与回溯

全排列问题

  • 思路:回溯法,用 visited 数组标记已使用数字,递归生成排列,注意撤销选择。
  • 常见题:组合总和、N 皇后问题。

6. 堆/优先级队列

Top K 问题

  • 思路:求最大 K 个用最小堆(维护大小为 K 的堆),求最小 K 个用最大堆。
  • 常见题:数组中的第 K 个最大元素(快速选择算法更优)。

7. 滑动窗口

无重复字符的最长子串

  • 思路:用哈希表记录字符最后出现位置,左指针在重复时移动,更新最大长度。
  • 常见题:最小覆盖子串(更难,需计数匹配)。

8. 位运算

只出现一次的数字

  • 思路:利用异或性质 a ^ a = 0,全部异或后剩下单独的数字。
  • 变种:两个单独数字(分组异或)。

安卓相关扩展

  1. LRU 缓存:哈希表 + 双向链表实现 O(1) 的 get/put。
  2. 任务调度:类似合并区间或优先级队列问题。
  3. 数据结构设计:要求线程安全时结合 ConcurrentHashMap 等。

面试建议

  • 先澄清问题:确认输入输出、边界条件。
  • 举例说明:用简单例子演示思路。
  • 复杂度分析:说明时间/空间复杂度。
  • 代码简洁:写清晰结构,必要时加注释。
  • 测试用例:自测边界(空值、重复、大数等)。

掌握这些核心思路,结合实际练习,能较好应对大多数算法考察。