程序员老鬼

实习了四十天被抓了,导员:回不去就开除。。

今天在网上看到一个网友的发帖,是这样的——这位同学在实习了四十天之后,被导员要求明天必须回学校,否则就会被开除。

结果他已经花了500元买了从杭州到济南的高铁票,准备回去,心里却在想:失去的,不只是这500元,还有这次宝贵的实习机会。

Image
老实说,这种事情,作为程序员,我的心情可以理解。

实习这件事,在现在的就业大环境下,几乎是每个学生都不能错过的机会。尤其是我们程序员这一行,学业重要,但更重要的是实际经验。如果能在大学期间找个靠谱的实习,不仅能学到技术,还能为将来就业打下基础。

但话说回来,虽然实习重要,但如果你是大一大二的学生,还是得把学业放在第一位。毕竟,学好基础,才能在未来的实习和工作中打下坚实的根基。

而大三大四,实习的机会更是关键——不过,像这位同学的遭遇,真的让人怀疑:学校的安排是不是有点让人抓狂?

总之,实习确实是个关键,大家得根据自己的情况好好权衡,但千万别忘了,自己的基础也是不可忽视的!

算法题:岛屿数量

聊一道经典的算法题:岛屿数量。
题目大致是这样的:给你一个二维网格,其中‘1’表示土地,‘0’表示水域。你需要计算岛屿的数量。岛屿是由相邻的‘1’组成的,而相邻的‘1’指的是上下左右或者斜着连接的‘1’。你需要找到所有的岛屿,并返回岛屿的总数。
简单来说,我们的任务就是在这个二维网格里找出有多少片孤立的陆地。

解题思路

要解决这个问题,最直接的思路就是做一个深度优先搜索(DFS)。看过这类题目的小伙伴应该都知道,DFS的核心思想就是“先下去”,不断探索周围未被访问的区域,直到不再能往下走为止,然后回溯继续。
我们可以这样做:
  1. 遍历整个网格,如果遇到‘1’(即陆地),就开始一个DFS搜索,把相邻的‘1’都标记成‘0’(即已经访问过了),防止重复计数。
  2. 每次进行DFS时,就认为找到了一座岛屿。
  3. 最终返回岛屿的总数。
这里的关键是标记已经访问过的陆地,防止重复计算。同样,这个问题其实也可以用广度优先搜索(BFS)来解,但DFS更加直观,所以我们先从DFS开始。

代码实现

让我们来看看如何用Java实现这个算法:
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); // 右
    }
}

代码讲解

  1. 我们首先检查输入的网格是否为空或者尺寸为0,如果是,就直接返回0。
  2. 然后,我们遍历整个网格,查找每一个陆地(‘1’)。当我们找到一个陆地时,就调用dfs方法进行深度优先搜索,把这个岛屿的所有部分都标记为‘0’,防止重复计算。
  3. 每次进行一次DFS搜索,都可以认为发现了一座新的岛屿,所以岛屿的计数加一。
  4. dfs方法的作用是从当前的位置开始,遍历所有相邻的陆地,并将其标记为已经访问。

时间和空间复杂度分析

  1. 时间复杂度:我们遍历了整个网格,最多会访问每一个元素一次。因此时间复杂度是O(m * n),其中m和n分别是网格的行数和列数。
  2. 空间复杂度:由于递归会使用栈空间,因此最坏情况下空间复杂度是O(m * n),也就是当整个网格是陆地时,递归的栈深度可能达到网格的总面积。

注意点

  1. 越界问题:在做DFS时,必须时刻记得检查边界,避免访问到数组外的元素。
  2. 标记已访问:DFS的关键就是标记已访问的陆地,这样可以防止重复计算岛屿。

总结

这道题看似简单,但其实考察了很多基础的算法技巧,包括图的遍历、DFS的实现、递归的使用等。通过这道题,大家可以加深对这些基础概念的理解。总的来说,解决这样的问题需要扎实的基础和一些耐心,不仅仅是知道DFS怎么用,还要会合理处理边界和递归深度的问题。

-END-

ok,今天先说到这,老规矩,给大家分享一份不错的副业资料,感兴趣的同学找我领取。

Image

以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。