某啰网友爆料:最新考勤要求,早10晚8,上午10-12,下午13-18,晚上19-20,落实8小时工作制~

文摘   2024-11-23 10:01   山西  

今天咱聊聊啰的“早10晚8”考勤制度。这信息一出,我第一反应是:“这不就披着‘人性化’外衣的8小时工作制吗?”但细看,发现亮点和槽点真是一大堆。

先说这时间安排吧,上午10点上班听起来挺美好,终于可以不用赶早高峰了,但一看到晚上8点下班。
更离谱的是,中午和晚饭各1小时“明确安排”,但老实说,午休那一小时真没啥好感恩的——饭吃完了躺不下,下午昏昏欲睡~

不过咱实话实说,“周平均8小时工作制”的要求确实比那些“007”公司好太多。
只要周平均时间对得上,灵活打卡的设定还算人性化,毕竟程序员讲究的就是效率,按结果说话,时间反倒其次。
但说到底,这种“改良版996”也别吹得太高,感觉就是一碗有点热情、又不太温暖的鸡汤罢了。
你怎么看?来聊聊

算法题:离建筑物最近的距离

聊一个算法问题,题目是:离建筑物最近的距离
题目是这样的:给你一个二维网格,0表示空地,1表示建筑物,2表示障碍物。你需要找出每个空地到所有建筑物的最短距离之和。
看到这里,我第一反应就是,BFS(广度优先搜索)可以搞定,妥妥的。毕竟BFS天生擅长这种「从一个点扩散到所有点」的场景,效率杠杠的。

解法思路

我们可以这样做:
  1. 初始化:创建两个网格,dist 用来记录每个空地到建筑物的距离总和,reach 记录每个空地被多少个建筑物触达。
  2. 逐一BFS:从每个建筑物出发,用 BFS 遍历整个网格,更新空地的 distreach
  3. 遍历找结果:最后,遍历整个网格,找到所有被所有建筑物触达的空地,并返回最小的 dist 值。
说得很热闹,直接上代码吧:
import java.util.*;

public class ShortestDistanceFromBuildings {
    public int shortestDistance(int[][] grid) {
        int rows = grid.length;
        int cols = grid[0].length;
        int[][] dist = new int[rows][cols];
        int[][] reach = new int[rows][cols];
        int buildingCount = 0;

        // Directions for BFS
        int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

        // Step 1: Traverse the grid to start BFS from each building
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if (grid[i][j] == 1) { // Found a building
                    buildingCount++;
                    boolean[][] visited = new boolean[rows][cols];
                    Queue<int[]> queue = new LinkedList<>();
                    queue.offer(new int[]{i, j});
                    int level = 0;

                    while (!queue.isEmpty()) {
                        level++;
                        int size = queue.size();
                        for (int k = 0; k < size; k++) {
                            int[] curr = queue.poll();
                            for (int[] dir : directions) {
                                int x = curr[0] + dir[0];
                                int y = curr[1] + dir[1];
                                if (x >= 0 && x < rows && y >= 0 && y < cols &&
                                    grid[x][y] == 0 && !visited[x][y]) {
                                    dist[x][y] += level;
                                    reach[x][y]++;
                                    visited[x][y] = true;
                                    queue.offer(new int[]{x, y});
                                }
                            }
                        }
                    }
                }
            }
        }

        // Step 2: Find the minimum distance
        int minDist = Integer.MAX_VALUE;
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                if (grid[i][j] == 0 && reach[i][j] == buildingCount) {
                    minDist = Math.min(minDist, dist[i][j]);
                }
            }
        }

        return minDist == Integer.MAX_VALUE ? -1 : minDist;
    }
}

代码解析

这段代码的核心就是 BFS。从每个建筑物开始扩散,记录每个空地到建筑物的距离。最后再遍历整个网格,找出被所有建筑物触达的空地,计算最小距离。
说人话就是——算法像个勤勤恳恳的快递员,挨家挨户跑腿,最后统计哪个点的距离最短,顺便吐槽:「离你家远的可不止一个餐厅外卖员生气!」

复杂度分析

  • 时间复杂度O(b * n * m),其中 b 是建筑物的数量,nm 是网格的行和列。每个建筑物做一次 BFS,每次 BFS 遍历整个网格。
  • 空间复杂度O(n * m),需要额外的网格记录距离和访问状态。

一些小坑

  1. 障碍物问题:BFS 要跳过障碍物,否则会算到不合法的点。
  2. 无解的情况:如果某个空地无法被所有建筑物触达,要返回 -1
这个算法题的精髓在于 BFS 的巧妙应用。那么大家觉得这题如何?欢迎来评论区吐槽或者分享更优解法!

-END-


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

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


程序媛山楂
5年+程序媛,专注于AI编程普及。本号主要分享AI编程、Chat账号、Chat教程、Sora教程、Suno AI、Sora账号、Sora提示词、AI换脸、AI绘画等,帮助解决各种AI疑难杂症。
 最新文章