算法面试必考题总结与代码解析
需积分: 9 118 浏览量
更新于2024-11-23
收藏 7.7MB ZIP 举报
资源摘要信息:"面试算法题总结"
算法在编程面试中是考察候选人逻辑思维和问题解决能力的重要环节。以下是面试中常见的算法题目的总结,包括题目描述、解决思路、代码实现、时间复杂度分析以及一些优秀的博客资源,旨在帮助想要提升面试能力的同学。
1. LintCode 373 Partition Array by Odd and Even
题目描述:给定一个整数数组,按照奇数在前,偶数在后的顺序重新排列数组。
解决思路:使用双指针技巧,一个指针从前向后寻找偶数,另一个指针从后向前寻找奇数,然后交换这两个数。
代码实现:(以Java为例)
```java
public void partitionArray(int[] nums) {
if (nums == null || nums.length < 2) return;
int left = 0, right = nums.length - 1;
while (left < right) {
while (left < right && nums[left] % 2 != 0) left++;
while (left < right && nums[right] % 2 == 0) right--;
if (left < right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
}
}
```
时间复杂度:O(n),其中n为数组长度。
2. LintCode 144 Interleaving Positive and Negative Numbers
题目描述:给定一个包含正数和负数的数组,重新排列数组,使正数、负数交替出现。如果有多种方案,则返回任意一种。
解决思路:使用双指针技巧和插入的方法,从数组开始处插入负数,然后从数组末尾插入正数。
代码实现:(以Java为例)
```java
public void interleavePositiveAndNegative(int[] nums) {
if (nums == null || nums.length < 2) return;
int start = 0, end = nums.length - 1;
while (start <= end) {
if (nums[start] < 0) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
end--;
} else {
start++;
}
}
int i = 0, j = 0, k = 0;
while (k < nums.length) {
if (i < start && (j > end || Math.abs(nums[i]) < Math.abs(nums[j]))) {
nums[k++] = nums[i++];
} else {
nums[k++] = nums[j++];
}
}
}
```
时间复杂度:O(n),其中n为数组长度。
3. LeetCode 54 Spiral Matrix
题目描述:给定一个m x n的矩阵,按照螺旋的顺序返回矩阵中的所有元素。
解决思路:模拟螺旋遍历过程,设置边界条件,向内收缩。
代码实现:(以Java为例)
```java
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> result = new ArrayList<>();
if (matrix == null || matrix.length == 0) return result;
int top = 0, bottom = matrix.length - 1, left = 0, right = matrix[0].length - 1;
while (left <= right && top <= bottom) {
for (int i = left; i <= right; i++) result.add(matrix[top][i]);
top++;
for (int i = top; i <= bottom; i++) result.add(matrix[i][right]);
right--;
if (top <= bottom) {
for (int i = right; i >= left; i--) result.add(matrix[bottom][i]);
bottom--;
}
if (left <= right) {
for (int i = bottom; i >= top; i--) result.add(matrix[i][left]);
left++;
}
}
return result;
}
```
时间复杂度:O(m*n),其中m和n分别为矩阵的行数和列数。
4. LeetCode 59 Spiral Matrix II
题目描述:给定一个正整数n,生成一个n x n的矩阵,按照螺旋顺序填充从1到n^2的数字。
解决思路:与LeetCode 54类似,增加了一步生成矩阵的过程。
代码实现:(以Java为例)
```java
public int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
int top = 0, bottom = n - 1, left = 0, right = n - 1;
int num = 1;
while (top <= bottom && left <= right) {
for (int i = left; i <= right; i++) matrix[top][i] = num++;
top++;
for (int i = top; i <= bottom; i++) matrix[i][right] = num++;
right--;
if (top <= bottom) {
for (int i = right; i >= left; i--) matrix[bottom][i] = num++;
bottom--;
}
if (left <= right) {
for (int i = bottom; i >= top; i--) matrix[i][left] = num++;
left++;
}
}
return matrix;
}
```
时间复杂度:O(n^2)。
5. LeetCode 53 Maximum Subarray
题目描述:给定一个整数数组,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
解决思路:使用动态规划的方法,维护一个当前最大和以及全局最大和。
代码实现:(以Java为例)
```java
public int maxSubArray(int[] nums) {
if (nums == null || nums.length == 0) return 0;
int currentMax = nums[0], maxSum = nums[0];
for (int i = 1; i < nums.length; i++) {
currentMax = Math.max(nums[i], currentMax + nums[i]);
maxSum = Math.max(maxSum, currentMax);
}
return maxSum;
}
```
时间复杂度:O(n)。
6. LeetCode 152 Maximum Product Subarray
题目描述:给定一个整数数组,找出乘积最大的连续子数组,并返回该子数组的乘积。
解决思路:动态规划,维护两个变量,分别表示当前最大乘积和最小乘积(最小乘积在乘以负数后可能变成最大乘积)。
代码实现:(以Java为例)
```java
public int maxProduct(int[] nums) {
if (nums == null || nums.length == 0) return 0;
int max = nums[0], min = nums[0], result = nums[0];
for (int i = 1; i < nums.length; i++) {
if (nums[i] < 0) {
int temp = max;
max = min;
min = temp;
}
max = Math.max(nums[i], max * nums[i]);
min = Math.min(nums[i], min * nums[i]);
result = Math.max(result, max);
}
return result;
}
```
时间复杂度:O(n)。
7. LintCode 138 Subarray Sum
题目描述:给定一个整数数组,找出总和为给定数值的最长连续子数组的长度。
解决思路:使用哈希表存储前缀和出现的位置,通过前缀和的差值来找是否存在连续子数组。
代码实现:(以Java为例)
```java
public int subarraySum(int[] nums, int target) {
int sum = 0, maxLength = 0;
HashMap<Integer, Integer> sumMap = new HashMap<>();
sumMap.put(0, -1);
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if (sumMap.containsKey(sum - target)) {
maxLength = Math.max(maxLength, i - sumMap.get(sum - target));
}
sumMap.put(sum, i);
}
return maxLength;
}
```
时间复杂度:O(n)。
8. LintCode 139 Subarray Sum Closest
题目描述:给定一个整数数组,找出和最接近给定数值的连续子数组的和。
解决思路:与LintCode 138类似,但是需要记录最接近的和以及对应的子数组。
代码实现:(以Java为例)
```java
public int subarraySumClosest(int[] nums, int target) {
int closestSum = Integer.MAX_VALUE;
int sum = 0;
HashMap<Integer, Integer> sumMap = new HashMap<>();
sumMap.put(0, -1);
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if (sumMap.containsKey(sum - target)) {
if (Math.abs(sum - target) < Math.abs(closestSum - target)) {
closestSum = sum;
}
}
sumMap.put(sum, i);
}
return closestSum;
}
```
时间复杂度:O(n)。
9. LeetCode 392 Is Subsequence
题目描述:判断一个字符串是否是另一个字符串的子序列。
解决思路:双指针分别遍历两个字符串,检查子序列。
代码实现:(以Java为例)
```java
public boolean isSubsequence(String s, String t) {
if (s == null || t == null) return false;
int j = 0;
for (int i = 0; i < t.length() && j < s.length(); i++) {
if (s.charAt(j) == t.charAt(i)) j++;
}
return j == s.length();
}
```
时间复杂度:O(n),其中n为字符串s的长度。
以上算法题目的相关知识点以及代码示例,可以作为面试准备的参考。同时,建议关注一些优秀的博客资源,如LeetCode官方题解、GeeksforGeeks、TopCoder等,来加深对算法的理解和应用。掌握这些算法题目及其解法,将有助于面试中更好地展示自己的编程能力。
2021-02-16 上传
321 浏览量
103 浏览量
2021-06-29 上传
2021-03-31 上传
2021-06-16 上传
2021-07-06 上传
2021-06-25 上传
2021-06-15 上传
卡卡乐乐
- 粉丝: 38
- 资源: 4679
最新资源
- 微信小程序-点餐
- ionicStudyWithTabs:带有 ngCordova 的离子模板项目
- note-taker
- XIANDUAN.rar
- 一种基于高通量测序的拷贝数变异检测自动化分析解读及报告系统.rar
- rasaxproject1
- GitHub Open All Notifications-crx插件
- gatsby-remark-component-images:一个Gatsby注释插件,将gatsby-plugin-sharp处理应用于html样式的markdown标签
- 易语言开关音频服务实现开关声音-易语言
- ComposeKmmMoviesApp
- HistogramComponentDemo.7z
- UA GPU-able Search-crx插件
- MYSQL数据库管理器(易语言2005年大赛三等奖)2010-10-27.rar
- native-api-notification-[removed]JavaScript中的本机通知API
- 将超像素作为输入MATLAB代码-laplacianseg:种子图像分割的拉普拉斯坐标
- MyDroid