听同学的建议拒绝了月薪2.5W的大厂offer,去了月薪5k的体制内,后来发现当初劝我的同学却进了大厂。。。
最近看到一个网友发帖,他说自己当初听了同学的建议,拒绝了月薪2.5W的大厂offer,毅然决然去了月薪5k的体制内。刚开始那会儿,他觉得自己做了个“明智的选择”——稳定啊,压力小啊,啥都好。
但是!几年过去了,他才发现,那位当初劝他说“不要去大厂,去体制内更好”的同学,竟然已经拿到了大厂的offer,月薪也早早地翻了好几倍,简直就是换了个“人生跑道”。
算法题:打砖块
打砖块这个题目一听就挺怀旧的,小时候玩的小霸王游戏机里,打砖块可是必备项目,没想到长大了,竟然还要用代码重温这份童年记忆。不过,这次不是用手柄,而是用键盘+脑子写代码。打砖块这个问题,说白了就是个二维数组+模拟的经典题型,既考察逻辑也考察细节处理,稍不注意就容易踩坑。
1. 小球的运动轨迹:这部分简单点,可以假设小球只垂直向下运动,撞到砖块后就停下。
2. 砖块的掉落逻辑:这是关键,消除砖块后,哪些砖块会掉下来,哪些会留在原地?这需要模拟重力的效果。
3. 边界条件:比如小球打到了网格的边缘,或者网格本身为空。
public class BreakBricks {public static void main(String[] args) {int[][] grid = {{1, 0, 0, 0}, {1, 1, 0, 0}, {1, 1, 1, 0}, {1, 1, 1, 1}};int[] ball = {0, 0}; // 小球发射的位置System.out.println("剩余砖块数量: " + breakBricks(grid, ball));}public static int breakBricks(int[][] grid, int[] ball) {// 1. 小球撞击砖块hitBrick(grid, ball[0], ball[1]);// 2. 模拟砖块掉落simulateGravity(grid);// 3. 统计剩余砖块return countBricks(grid);}private static void hitBrick(int[][] grid, int row, int col) {if (row < 0 || row >= grid.length || col < 0 || col >= grid[0].length || grid[row][col] == 0) {return;}grid[row][col] = 0;// 撞碎砖块}private static void simulateGravity(int[][] grid) {for (int col = 0; col < grid[0].length; col++) {int bottom = grid.length - 1;// 从底部开始for (int row = grid.length - 1; row >= 0; row--) {if (grid[row][col] != 0) {// 把砖块往下移grid[bottom][col] = grid[row][col];if (bottom != row)grid[row][col] = 0;// 清空原位置bottom--;}}}}private static int countBricks(int[][] grid) {int count = 0;for (int[] row : grid) {for (int cell : row) {if (cell != 0) count++;}}return count;}}
1. 小球撞击逻辑:这里假设小球只会垂直向下撞击第一个砖块,如果题目要求更复杂的小球运动,比如斜着弹来弹去,那就得加上方向的处理。这个代码里没处理,是因为我觉得垂直打砖块已经够用了。
2. 模拟重力:砖块掉落的逻辑其实就是从下往上扫描,把非零的砖块“压”到最底部。这种思路简单直接,适合这种二维数组的模拟题。
3. 边界条件:比如小球发射的起点是否有效?砖块是否全都已经被清空?这些都需要在实际写代码时仔细考虑。
写完代码跑测试的时候,我还一度怀疑自己是不是手抖写错了。果然,代码如人生,细节决定成败,debug如谈恋爱,得多点耐心。
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
-END-
以上,就是今天的分享了,看完文章记得右下角点赞,也欢迎在评论区写下你的留言。