外包对我怀恨在心,处处给我使绊子~

文摘   2024-11-18 12:52   陕西  
这不,我刷到一个帖子,说外包对楼主怀恨在心,还处处给使绊子,问大家怎么让对方彻底疯狂。乍一看,确实挺戳人的,但仔细想想,这事儿没必要这么较劲。
先说我的观点:我觉得吧,工作本质上就是“混口饭吃”,何必跟外包杠得像宿敌似的。🤔他对你怀恨在心,可能是因为沟通上有误解,也可能是因为利益分配不均。

遇到这种情况,程序员的解决思路很简单——debug问题的根源。
办法一:输出debug日志,冷静沟通。
先别急着对线,和他聊聊哪里出了问题,说不定发现他误会了你的“PR代码风格”。沟通一下,说不定还能解决矛盾。
办法二:写个补丁,优化协作流程。
如果沟通无效,就优化自己的工作流程,少留可钻的空子。比如说任务分解得更清晰、需求文档写得更详尽,这样就算对方想使绊子也无从下手。😏
没必要为了让别人“彻底疯狂”浪费内存和CPU。保持代码(自己)的稳定和高效,比在意其他线程的死循环更重要!🧑‍💻大家怎么看呢?

算法题:猜数字游戏

最近我刷到一个经典的算法题:猜数字游戏。这个题目很适合用来锻炼逻辑思维和算法能力,说白了,就是写代码的时候脑袋要转得比风扇还快。
题目要求是这样的:
有一个秘密数字,由一组不同的数字组成。你每次猜一个数字后,系统会返回两个提示:一个是bulls(公牛),代表你猜对了数字且位置也对;另一个是cows(母牛),表示数字猜对了但位置不对。目标是根据这些反馈,尽快猜出秘密数字。
这个规则乍一看,像极了“黑白猜”这种小时候玩的游戏,但换到编程里就变成了另一个样子。

写代码解决这问题的核心,其实就两点:
  1. 判断哪些数字是公牛;
  2. 判断哪些数字是母牛。
别急,我们先来拆解一下这个题目。

思路拆解

为了简单起见,我们假设输入是两个字符串,secret 是秘密数字,guess 是玩家的猜测。例如:
String secret = "1807";
String guess = "7810";

先找公牛 🐂

公牛好理解嘛,就是看位置和数字都对的字符。所以我们可以直接用一个循环,检查两个字符串的对应位置是不是相等:
int bulls = 0;
for (int i = 0; i < secret.length(); i++) {
    if (secret.charAt(i) == guess.charAt(i)) {
        bulls++;
    }
}

再找母牛 🐄

母牛稍微复杂一点,因为它是“数字对但位置不对”的情况。这里需要用到一个辅助的结构,比如两个数组,统计 secretguess 中每个数字出现的频次。
举个例子,假如 secret1807guess7810,那我们在跳过公牛的情况下,把每个字符频次存下来,就像这样:
  • 对于 secret1 出现 1 次,8 出现 1 次,0 出现 1 次,7 出现 1 次;
  • 对于 guess7 出现 1 次,8 出现 1 次,1 出现 1 次,0 出现 1 次。
然后母牛的数量就是两边频次的交集,但要记得扣掉那些已经被算作公牛的部分。
代码实现如下:
int[] secretCount = new int[10];
int[] guessCount = new int[10];

// 统计非公牛的字符频次
for (int i = 0; i < secret.length(); i++) {
    if (secret.charAt(i) != guess.charAt(i)) {
        secretCount[secret.charAt(i) - '0']++;
        guessCount[guess.charAt(i) - '0']++;
    }
}

// 计算母牛数量
int cows = 0;
for (int i = 0; i < 10; i++) {
    cows += Math.min(secretCount[i], guessCount[i]);
}

最终结果

最后别忘了把结果组合成我们要的格式,通常是像 "xAyB" 这样的字符串,x 是公牛数量,y 是母牛数量。
return bulls + "A" + cows + "B";

完整代码 💻

综合起来,一个完整的解决方案长这样:
public String getHint(String secret, String guess) {
    int bulls = 0;
    int[] secretCount = new int[10];
    int[] guessCount = new int[10];
    
    for (int i = 0; i < secret.length(); i++) {
        if (secret.charAt(i) == guess.charAt(i)) {
            bulls++;
        } else {
            secretCount[secret.charAt(i) - '0']++;
            guessCount[guess.charAt(i) - '0']++;
        }
    }
    
    int cows = 0;
    for (int i = 0; i < 10; i++) {
        cows += Math.min(secretCount[i], guessCount[i]);
    }
    
    return bulls + "A" + cows + "B";
}
这题吧,初看可能有点绕,尤其是“公牛母牛”的计数问题,但拆开来其实不难。更重要的是,这种题目很适合用在面试里出出难题(面试官笑了)。
如果你想装深沉,还可以顺便提一嘴优化。比如上面的解法用了 O(n) 的时间复杂度,但空间复杂度是 O(1)(只用了两个长度为 10 的数组)。你再顺手提个“两次遍历解决问题”,那面试官可能会对你刮目相看。

-END-


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

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

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