实习了四十天被抓了,导员:回不去就开除。。
今天在网上看到一个网友的发帖,是这样的——这位同学在实习了四十天之后,被导员要求明天必须回学校,否则就会被开除。
结果他已经花了500元买了从杭州到济南的高铁票,准备回去,心里却在想:失去的,不只是这500元,还有这次宝贵的实习机会。
实习这件事,在现在的就业大环境下,几乎是每个学生都不能错过的机会。尤其是我们程序员这一行,学业重要,但更重要的是实际经验。如果能在大学期间找个靠谱的实习,不仅能学到技术,还能为将来就业打下基础。
而大三大四,实习的机会更是关键——不过,像这位同学的遭遇,真的让人怀疑:学校的安排是不是有点让人抓狂?
算法题:岛屿数量
解题思路
遍历整个网格,如果遇到‘1’(即陆地),就开始一个DFS搜索,把相邻的‘1’都标记成‘0’(即已经访问过了),防止重复计数。 每次进行DFS时,就认为找到了一座岛屿。 最终返回岛屿的总数。
代码实现
public class Solution {
public int numIslands(char[][] grid) {
if (grid == null || grid.length == 0) return 0;int rows = grid.length;
int cols = grid[0].length;
int islandCount = 0;for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (grid[i][j] == '1') { // 找到陆地
islandCount++;
dfs(grid, i, j); // 从该点开始进行DFS
}
}
}return islandCount;
}private void dfs(char[][] grid, int i, int j) {
// 如果越界或者当前位置是水域,直接返回
if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == '0') {
return;
}// 标记当前陆地为已访问
grid[i][j] = '0';// 向上下左右四个方向进行DFS
dfs(grid, i - 1, j); // 上
dfs(grid, i + 1, j); // 下
dfs(grid, i, j - 1); // 左
dfs(grid, i, j + 1); // 右
}
}
代码讲解
我们首先检查输入的网格是否为空或者尺寸为0,如果是,就直接返回0。 然后,我们遍历整个网格,查找每一个陆地(‘1’)。当我们找到一个陆地时,就调用 dfs方法进行深度优先搜索,把这个岛屿的所有部分都标记为‘0’,防止重复计算。每次进行一次DFS搜索,都可以认为发现了一座新的岛屿,所以岛屿的计数加一。 dfs方法的作用是从当前的位置开始,遍历所有相邻的陆地,并将其标记为已经访问。
时间和空间复杂度分析
时间复杂度:我们遍历了整个网格,最多会访问每一个元素一次。因此时间复杂度是O(m * n),其中m和n分别是网格的行数和列数。 空间复杂度:由于递归会使用栈空间,因此最坏情况下空间复杂度是O(m * n),也就是当整个网格是陆地时,递归的栈深度可能达到网格的总面积。
注意点
越界问题:在做DFS时,必须时刻记得检查边界,避免访问到数组外的元素。 标记已访问:DFS的关键就是标记已访问的陆地,这样可以防止重复计算岛屿。
总结
-END-
以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。