【KO】android 面试 算法
以下是针对 Android 开发面试中这些算法问题的 Java 解答,结合 Android 场景和 Java 语言特性:
1. 如何运用二分查找算法
原理:在有序数组中,通过不断将查找范围减半,快速定位目标值。
步骤:
- 初始化左右边界
left = 0
,right = 数组长度 - 1
。 - 循环条件
left <= right
,计算中间位置mid = left + (right - left) / 2
。 - 比较中间元素与目标值:
- 相等则返回
mid
。 - 中间元素小于目标值,调整
left = mid + 1
。 - 中间元素大于目标值,调整
right = mid - 1
。
- 相等则返回
- 未找到返回 -1 。
Java 示例(在有序数组找目标值):
public int binarySearch(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;} else if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return -1;
}
2. 如何高效解决接雨水问题
原理(双指针法):雨水能留存的高度由左右两侧最高柱子中较矮的决定。用双指针遍历,维护左右最高高度,计算可接雨水。
Java 示例:
public int trap(int[] height) {int left = 0, right = height.length - 1;int leftMax = 0, rightMax = 0;int res = 0;while (left < right) {leftMax = Math.max(leftMax, height[left]);rightMax = Math.max(rightMax, height[right]);if (leftMax < rightMax) {res += leftMax - height[left];left++;} else {res += rightMax - height[right];right--;}}return res;
}
3. 二分查找高效判定子序列
原理:对长字符串预处理,记录每个字符出现的索引列表。遍历子序列字符,用二分查找在对应索引列表找合适位置,保证索引递增。
Java 示例:
import java.util.ArrayList;
import java.util.List;public boolean isSubsequence(String s, String t) {List<Integer>[] idx = new ArrayList[256]; for (int i = 0; i < t.length(); i++) {char c = t.charAt(i);if (idx[c] == null) {idx[c] = new ArrayList<>();}idx