大厂程序员爆料:原来30k,被裁后找了个外包25k,活少不加班感觉日子有点安逸了~
曾经在大厂拿着30k,结果被裁员后,找到外包工作,工资降了点,25k,但活儿轻松,基本7点多就能下班,感觉日子变得安逸了很多。
老实说,之前在大厂的时候,真的是拼命干,工资看起来不错,但每天要面对的就是堆不完的代码和永无止境的加班。
上班就像是机器,不停地工作,不停地赶进度。996成了常态,心里早就开始厌倦了这种生活。
结果被裁后,换了个外包工作,虽然薪水少了点,但真的轻松了不少。
不过,安逸虽然好,但也有点危险。作为程序员,虽然外包工作看似轻松,但如果一直待在这个舒适区里,不再追求新的技术,久而久之,就可能掉队,错失更多的机会。
技术更新换代很快,如果自己停下来不进步,可能下一次想跳槽时,别人已经把你甩得很远了。【备注:文末可领最新资料】。
算法题:掉落的方块
今天我们聊一个可能让你觉得既有趣又有点烧脑的问题:掉落的方块 算法题。
你可能会想,掉落的方块听起来好像是个小游戏,或者像你在玩《俄罗斯方块》时那个不停掉下来的长条、正方形方块。
确实,有点像。但实际上,这个问题涉及的算法和思路比游戏中的“掉落”要复杂得多。今天,我们就来看看如何通过代码模拟这个掉落过程。
问题大致是这样的:
假设我们有一个宽度为 width 的矩阵,这个矩阵代表一个屏幕,而在这个屏幕上,不同形状的方块不断从顶部掉落。每个方块都是由若干个单元格组成的,我们要在方块掉落到屏幕底部时,找到一个合适的位置放置它们。
我们需要解决两个问题:
识别每个方块掉落的位置。 确保方块的堆叠不会越界。
看起来是不是有点复杂?但其实,这和你平时做的UI布局有点像,毕竟涉及到屏幕中的物体如何“落地”,而不是“浮动”在空中。接下来,让我们通过代码一步步来解析这个问题。
首先,我们来定义问题中的核心部分:模拟“掉落”的过程。假设我们用一个二维数组来表示这个矩阵,其中每个单元格的值为0代表空白,1代表已经有方块占据。我们要写一个方法,让每个方块按照给定的规则掉落,并确保其不和已存在的方块发生重叠。
代码实现
public class FallingBlocks { // 模拟掉落过程
public static void dropBlock(int[][] grid, int width, int[] block) {
// 从顶部开始“掉落”
int position = findDropPosition(grid, width, block);
// 将方块放置到找到的位置
placeBlock(grid, position, block);
}
// 找到方块可以掉落的位置
public static int findDropPosition(int[][] grid, int width, int[] block) {
// 从底部向上扫描,找到一个可以容纳方块的空位
for (int row = grid.length - 1; row >= 0; row--) {
boolean canPlace = true;
// 检查该行是否有足够空间放置方块
for (int col = 0; col < block.length; col++) {
if (grid[row][col] == 1) {
canPlace = false;
break;
}
}
if (canPlace) {
return row;
}
}
return -1; // 如果找不到合适位置,返回-1
}
// 将方块放置到指定位置
public static void placeBlock(int[][] grid, int row, int[] block) {
for (int i = 0; i < block.length; i++) {
grid[row][i] = 1; // 将方块放置在合适的单元格上
}
}
public static void main(String[] args) {
// 假设宽度为5,方块的形状是一个1x3的矩形
int[][] grid = new int[10][5]; // 创建一个10x5的屏幕矩阵
int[] block = {1, 1, 1}; // 方块的形状
dropBlock(grid, 5, block); // 模拟方块掉落
// 打印结果
for (int i = 0; i < grid.length; i++) {
for (int j = 0; j < grid[i].length; j++) {
System.out.print(grid[i][j] + " ");
}
System.out.println();
}
}
}
代码解读
dropBlock方法:这是整个程序的入口。它接受一个二维数组grid,代表屏幕状态,width代表屏幕的宽度,block则是当前掉落的方块。首先,它会调用findDropPosition来确定方块可以掉落的位置,接着调用placeBlock把方块放置到合适的位置。findDropPosition方法:它的作用是模拟方块从顶部到达底部的过程,寻找第一个可以放置方块的位置。我们从矩阵的底部开始逐行扫描,遇到没有被占据的位置时,就认为该位置可以放置方块。placeBlock方法:一旦我们找到了合适的放置位置,这个方法就会把方块放置到矩阵中。它会将矩阵中相应位置的值设为1,表示该位置被占据。
一些细节
在模拟这个掉落的过程中,我们简单地做了几件事:
通过从底部向上搜索,确保方块不会落到已有方块的上面。 确保方块的宽度适配矩阵的宽度,否则就会越界。
这里的算法时间复杂度是 O(n),其中 n 是矩阵的行数。每次掉落方块时,我们都需要从底部到顶部扫描一次,找到空位进行放置。
小结
其实,掉落的方块这个问题与很多现实世界的布局问题有共通之处,特别是游戏开发和UI设计中的排版。通过这样的模拟算法,我们不仅能解决方块的掉落问题,还能更好地理解二维数组的操作,和如何在复杂的布局中确保元素不重叠。
对于程序员来说,解决这类问题最重要的不是简单的实现,而是如何在保证效率的同时,处理好每个细节。在实际应用中,这种算法还可以延伸到更多复杂的场景,比如动态调整矩阵大小、方块形状的多样性等。
-END-
以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。