网友爆料:被降薪10%,主管让我别着急,降薪总比被裁员好,结果2个月后,主管被降薪25%,他不接受。。

文摘   2024-12-10 10:01   陕西  
最近看到一个网友的爆料,真是让我感叹。

这个网友说自己被公司降薪了10%,结果主管还一副“你别着急”安慰他,说降薪总比被裁员好。嗯,听起来有点道理,毕竟谁不怕突然被裁员呢?不过没想到,故事的转折很快就来了——两个月后,那位主管自己也被降薪了,直接降了25%。而且,他居然还不服气,说自己每个月房贷要5000多,怎么受得了啊!

你说那主管当时那么安慰人,结果自己也没能躲过降薪的“雷区”。像不像做代码审查时,那些看似没问题的部分,突然在生产环境下就炸了。

我们经常说“降薪总比裁员好”,但当你自己真的被降薪了,又觉得那10%的差距,是真的太难受~

所以呀,事情不发生在自己身上是不知道痛的~

算法题:祖玛游戏

今天给大家带来一道算法题:祖玛游戏

说实话,看到这个题目时,我脑袋里首先浮现的不是复杂的算法,而是那些在游戏里疯狂点球、消除小球的时光。你想,小时候玩这种游戏的时候,只想着尽快消除掉屏幕上的那些小球,根本没想过背后有多少复杂的算法在支撑。但作为程序员,看到类似问题时,脑袋里首先跳出来的就是“怎么才能高效解决这个问题”。

祖玛游戏的规则其实很简单:玩家通过在指定位置插入一个球来消除掉与之相连的同色球。三颗及以上相同颜色的球相邻时,就会触发消除。目标就是尽量少的步骤消除掉所有的球,或者判断有没有可能清除完。

问题分析

这个题目看似简单,但解决起来却不那么容易。首先,我们面临的挑战是如何在手中的球(就是hand)和当前的球链(board)之间进行最优操作。通过插入一个球,我们可能会消除一些球,然后剩下的球也会影响到我们的决策。

为了高效地解决这个问题,我们需要的就是递归回溯的策略,但要注意避免重复计算和冗余操作。我们还要处理一个特别重要的步骤:每次插入球后,要判断是否有连续的球满足消除条件,如果有,就需要进行消除。

解题思路

  1. 插入球并消除:我们每次尝试在不同位置插入一个球,然后消除掉可以消除的球。消除的规则是:连续三个及以上相同颜色的小球会被移除。

  2. 递归回溯:我们从hand中的球开始尝试,递归地模拟每种可能的插入方式。每次插入一个球后,我们都会进入一个新的状态,继续递归。最终,如果能够通过这种方式清除所有球,就返回步骤数。如果不能,返回-1。

  3. 优化剪枝:为了提高效率,我们需要避免无意义的计算。例如,如果在某个位置插入一个球后,不能消除任何球,那么这个位置就可以被跳过。

代码实现

以下是我实现的代码:

public class ZumaGame {
    public int findMinStep(String board, String hand) {
        // 使用回溯法递归地模拟每次插入的操作
        return dfs(board, hand);
    }

    private int dfs(String board, String hand) {
        // 如果板上的球都已经被清除完,返回0
        if (board.isEmpty()) {
            return 0;
        }
        // 如果手上的球已经没有了,返回-1
        if (hand.isEmpty()) {
            return -1;
        }

        int minSteps = Integer.MAX_VALUE;
        
        // 遍历手中的每个球,尝试将它插入到board的每个位置
        for (int i = 0; i < hand.length(); i++) {
            for (int j = 0; j <= board.length(); j++) {
                // 插入球到board的j位置
                String newBoard = insertBall(board, hand.charAt(i), j);
                // 执行消除过程
                String reducedBoard = reduceBoard(newBoard);

                // 递归地尝试下一步
                int nextStep = dfs(reducedBoard, hand.substring(0, i) + hand.substring(i + 1));
                
                // 更新最小步骤数
                if (nextStep != -1) {
                    minSteps = Math.min(minSteps, nextStep + 1);
                }
            }
        }

        // 如果最小步骤数仍然是最大值,说明没有解
        return minSteps == Integer.MAX_VALUE ? -1 : minSteps;
    }

    // 插入一个球到指定位置
    private String insertBall(String board, char ball, int index) {
        return board.substring(0, index) + ball + board.substring(index);
    }

    // 消除连成一线的球
    private String reduceBoard(String board) {
        StringBuilder sb = new StringBuilder(board);
        boolean changed = true;

        while (changed) {
            changed = false;
            for (int i = 0; i < sb.length() - 2; i++) {
                if (sb.charAt(i) == sb.charAt(i + 1) && sb.charAt(i) == sb.charAt(i + 2)) {
                    sb.delete(i, i + 3);
                    changed = true;
                    break// 从头开始重新检查
                }
            }
        }

        return sb.toString();
    }

    public static void main(String[] args) {
        ZumaGame game = new ZumaGame();
        String board = "WRRBB";  // 初始状态
        String hand = "RB";  // 手中的球
        System.out.println(game.findMinStep(board, hand)); // 输出最少步骤数
    }
}

代码解析

  1. dfs 方法:这是核心递归函数,我们在每一层递归中尝试在不同位置插入一个球,并检查插入后是否能够消除球。递归终止条件是所有的球被消除或者没有办法消除。

  2. insertBall 方法:该方法用来将手中的一个球插入到board的指定位置。

  3. reduceBoard 方法:这个方法模拟了消除过程。它会检查连续的三个相同颜色的球,并将其从board中删除。这个过程会持续,直到没有连续的三个相同颜色的球为止。

性能优化

在实际使用中,可能会遇到性能瓶颈。这个题目的时间复杂度非常高,尤其是在boardhand较大的情况下。虽然递归可以解决问题,但每次插入和消除的操作都会创建新的字符串,导致性能较差。因此,优化方向之一是使用更高效的数据结构(例如StringBuilder)来减少内存开销,并且通过更多的剪枝操作减少无效的递归。

小结

通过这道题,我深刻体会到算法设计中的细致入微。你看似只是插入一个球,但背后却隐藏了复杂的消除、递归和剪枝过程。游戏是简单的,算法才是复杂的。回过头来看,祖玛游戏不仅仅是消除球,还是思维和耐心的双重挑战。作为程序员,遇到这样的题目时,最好的办法就是冷静思考,每一步都要谨慎行事,才能成功通关!

-END-


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

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

程序员老鬼
10年+老程序员,专注于AI知识普及,已打造多门AI课程,本号主要分享国内AI工具、AI绘画提示词、Chat教程、AI换脸、Chat中文指令、Sora教程等,帮助读者解决AI工具使用疑难问题。
 最新文章