专栏名称: 鸭哥聊Java
回复关键字:666 ,领取免费简历模板,Java面试题,Java编程视频等。本号内容涵盖Java源码,JVM源码,Dubbo源码,Spring源码,Spring Cloud微服务架构,分布式高并发架构技术,MySQL性能调优等。
目录
相关文章推荐
新声Pro  ·  我们与鬼神的距离 ·  18 小时前  
新声Pro  ·  我们与鬼神的距离 ·  18 小时前  
秦皇岛晚报  ·  【中国好手艺117】铁艺灯笼 ·  3 天前  
秦皇岛晚报  ·  【中国好手艺117】铁艺灯笼 ·  3 天前  
古典文献学微刊  ·  编辑·手记 | ... ·  5 天前  
51好读  ›  专栏  ›  鸭哥聊Java

你们抵制996,但工作量完不成,不加班怎么办?

鸭哥聊Java  · 公众号  ·  · 2025-01-21 11:31

正文

今天我在网上看到一个贴子,问的是:“你们抵制996,但工作量完不成,不加班怎么办?”我觉得这个问题得掰开了看。

先说加班这事儿吧。有人觉得加班是因为工作量太大,时间不够用,可实际上很多时候,问题出在任务安排不合理上。

说白了,就是在资源和时间都有限的情况下,老板却指望员工像机器一样“高效运转”,这不,最后只能靠加班硬顶。但换个思路,如果能合理规划任务,明确优先级,把不必要的需求砍掉,事情就简单多了。

当然,还有一种情况就是“文化问题”,也就是所谓的“加班文化”。很多公司把加班当成一种考核手段,觉得谁加班多谁就更努力、更值得提拔。可这种逻辑经不起推敲,加班不能证明能力,只能说明效率低下或者公司管理有问题。

那如果任务真的压到喘不过气怎么办?这个时候,我觉得可以把任务拆解成更小的模块,逐步推进,不追求一次性完美交付。再不济,学会适时拒绝也是一门艺术 【备注:文末可领最新资料】

今日算法题


好了,我们回归正题, 今天咱们来聊一道有点意思的算法题,名字叫“ 可怜的小猪 ”。光看题目,可能你会想:“这是啥?小猪和算法能扯上啥关系?”别急,这题目其实是在考我们数学思维和逻辑能力,看似可怜的猪,背后藏着一套精妙的推理逻辑。

简单说,就是有一堆桶,其中有一桶装着毒药,我们要在有限的时间内通过喂猪喝水的实验,确定是哪一桶。题目给了几个关键参数:

  • buckets :桶的总数。
  • minutesToDie :猪喝到毒药后会死亡所需的时间。
  • minutesToTest :我们总共有多少时间来做实验。

我们的目标是最小化实验中需要的小猪数量,同时保证能准确找出哪一桶是毒药。

这道题目乍一看有点懵,觉得怎么能用最少的小猪解决问题呢?我们先来理清几个核心点:

  1. 小猪可以多次测试,每次测试后根据其存活或死亡的情况来获取信息。
  2. 小猪喝水的方式决定了我们能够获取的信息量。比如,一个猪一次测试有两种可能性:存活或者死亡。
  3. 我们需要利用猪的死亡和存活状态,将桶分组,并通过组的状态唯一确定哪一桶含毒。

换句话说,这题的核心在于如何利用小猪的状态构建一种“信息编码方式”,以最少的小猪数找到毒药桶的位置。

推导最少小猪数量

时间周期和状态数量: 一个猪在 minutesToTest 内可以测试的轮次是: rounds = minutesToTest / minutesToDie (向下取整)。在每轮测试中,一个猪的状态可以分为两种:活着或者死了。如果我们有多头猪,每头猪的状态组合会呈现指数增长。

状态数量公式: 对于 n 头猪和 rounds 轮测试,总的状态数量为 (rounds + 1)^n 。这里的 (rounds + 1) 表示每头猪有多少种可能的状态(活或者死), n 表示我们有多少头猪。

找到毒药桶的数量: 我们需要通过这些状态区分所有的桶,也就是说,状态的总数需要覆盖 buckets ,即:

(rounds + 1)^n >= buckets

然后,我们通过公式解出最小的 n

n = ceil(log(buckets) / log(rounds + 1))

有了公式后,接下来看代码如何实现:

public class PoorPigs {
    public int poorPigs(int buckets, int minutesToDie, int minutesToTest) {
        // 计算最多可以测试的轮数
        int rounds = minutesToTest / minutesToDie;
        // 每头猪的状态数
        int states = rounds + 1;
        // 猪的数量
        int pigs = 0;
        
        // 利用公式计算最小需要的猪数量
        while (Math.pow(states, pigs) < buckets) {
            pigs++;
        }
        
        return pigs;
    }

    public static void main(String[] args) {
        PoorPigs solution = new PoorPigs();
        System.out.println(solution.poorPigs(10001560)); // 输出示例
    }
}

代码解析

  1. 首先计算 rounds ,表示在给定时间内能测试的轮数。
  2. states 表示每头猪的状态数(死亡或存活)。
  3. 使用 Math.pow 来计算 (rounds + 1)^pigs ,并通过循环找到满足公式的最小 pigs
  4. 返回 pigs ,即所需的小猪数。

假设有 1000 桶水, minutesToDie 为 15 分钟, minutesToTest 为 60 分钟:

  • 我们有 rounds = 60 / 15 = 4 次测试机会。
  • 每头猪有 rounds + 1 = 5 种状态。
  • 要覆盖 1000 个桶,我们需要找到最小的 pigs ,使得 5^pigs >= 1000






请到「今天看啥」查看全文