以下是一些安卓面试中常见的算法题类型及简要思路:
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,全部异或后剩下单独的数字。 - 变种:两个单独数字(分组异或)。
安卓相关扩展
- LRU 缓存:哈希表 + 双向链表实现 O(1) 的 get/put。
- 任务调度:类似合并区间或优先级队列问题。
- 数据结构设计:要求线程安全时结合 ConcurrentHashMap 等。
面试建议
- 先澄清问题:确认输入输出、边界条件。
- 举例说明:用简单例子演示思路。
- 复杂度分析:说明时间/空间复杂度。
- 代码简洁:写清晰结构,必要时加注释。
- 测试用例:自测边界(空值、重复、大数等)。
掌握这些核心思路,结合实际练习,能较好应对大多数算法考察。