创新工厂面试题详解:共打了多少鱼

简介: 最近看到一个创新工厂的面试题,很有意思,下面给出算法实现(Java代码)。如果哪位有更好的算法,请跟贴。        abcde五人打渔,打完睡觉,a先醒来,扔掉1条鱼,把剩下的分成5分,拿一份走了;b再醒来,也扔掉1条,把剩下的分成5份,拿一份走了;然后cde都按上面的方法取鱼。

最近看到一个创新工厂的面试题,很有意思,下面给出算法实现(Java代码)。如果哪位有更好的算法,请跟贴。

       abcde五人打渔,打完睡觉,a先醒来,扔掉1条鱼,把剩下的分成5分,拿一份走了;b再醒来,也扔掉1条,把剩下的分成5份,拿一份走了;然后cde都按上面的方法取鱼。问他们一共打了多少条鱼,写程序和算法


共打了多少条鱼的结果有很多。但求最少打的鱼的结果是3121条鱼(应该找这5个人问问,用什么工具打了这么多条鱼)

 

大家可以先用计算器验证一下3121是否正确。

 

a开始拿鱼:  (3121 - 1) / 5  = 625   

同理,bcde分别获得的鱼数(不包括其扔掉的鱼)b:499   c:399   d:319  e:255

这道题最简单的方法就是枚举。从最小值开始,先看看代码(Java实现)。

public class Test

{

   public static void main(String[] args)

   {

      //  分别保存a至e获取的鱼数(为了方便,包括其扔掉的鱼)

      int[] everybody_fish = new int[5];

       // 临时数组,保存当前鱼数减1后除5的余数,只有都为0,才满足条件

      int[] temp = new int[5];

       //  从1扫描到10000

      for (int x = 1; x <= 10000; x++)

      {

           // 当前已被取走多少鱼(包括被扔的鱼)

        int sum = 0;

        int i = 0;

           // 计算abcde各获取的鱼数

        for (i = 0; i < everybody_fish.length; i++)

        {

           temp[i] = (x - 1 - sum) % everybody_fish.length;

              //  只要有一个人不能平均分配剩余的鱼,就不满足条件

           if (temp[i] != 0)

              break;

           everybody_fish[i] = (x - 1 - sum) / everybody_fish.length + 1;

           sum += everybody_fish[i];

        }

           // for循环正党结束,满足条件,输出相应的值。

        if (i == everybody_fish.length)

        {

 

           System.out.print("共钓了" + x + "条鱼     ");

           for (i = 0; i < everybody_fish.length; i++)

           {

              System.out.print((char) ('a' + i) + ":"

                    + (everybody_fish[i] - 1) + "   ");

           }

           System.out.print("最后剩余" + (x - sum) + "条鱼      ");

           System.out.println("扔了" + everybody_fish.length + "条鱼");

        }

       }

    }

}


运行上面的代码,会输出如下三行信息

共钓了3121条鱼    a:624   b:499   c:399  d:319   e:255   最后剩余1020条鱼       扔了5条鱼

共钓了6246条鱼    a:1249   b:999   c:799  d:639   e:511   最后剩余2044条鱼       扔了5条鱼

共钓了9371条鱼    a:1874   b:1499   c:1199  d:959   e:767   最后剩余3068条鱼       扔了5条鱼

 

在10000以内只有三个数满足这个条件。上面的代码是通用的,如将两个数组的长度改为6,将10000改成50000,会输出如下信息。

 

共钓了46651条鱼    a:7775   b:6479   c:5399  d:4499   e:3749   f:3124  最后剩余15620条鱼       扔了6条鱼

 

也就是说一共6个人。每个人也是先扔一条鱼,然后再将剩余的鱼6等分,取走一份。 在50000以内只有46651满足这个条件。



在本题中只有如下的代码是核心算法,其他的都是枚举和输出结果的代码。

for (i = 0; i < everybody_fish.length; i++)

{

    temp[i] = (x -1 - sum) % everybody_fish.length;

  //  只要有一个人不能平均分配剩余的鱼,就不满足条件

    if (temp[i] !=0)

        break;

   everybody_fish[i] = (x - 1 - sum) / everybody_fish.length + 1;

    sum +=everybody_fish[i];

}


目录
相关文章
|
6月前
|
Java C++
C++-带你初步走进继承(2)
C++-带你初步走进继承(2)
48 0
|
6月前
|
编译器 程序员 C++
C++-带你初步走进继承(1)
C++-带你初步走进继承(1)
36 0
|
5月前
|
Java 编译器 数据库连接
JAVA注解:代码界的“隐形翅膀”?!
【6月更文挑战第29天】Java注解,编程的“隐形翅膀”,提供编译检查、框架集成及自定义元数据功能。如@Override确保方法重写正确,@Autowired在Spring中自动装配Bean。通过自定义注解,开发者能创造独特代码逻辑。例如,定义@SpecialProcessing注解标记需特殊处理的方法,增强代码可读性和可扩展性。利用注解,让代码飞翔在更广阔的世界。
31 1
|
12月前
|
存储 编译器 C语言
【C++从0到王者】第二站:类和对象(上)
【C++从0到王者】第二站:类和对象(上)
31 0
|
设计模式 uml
带你走进类图
带你走进类图
78 0
|
JSON 安全 Java
5. JsonFactory工厂而已,还蛮有料,这是我没想到的
一件事情本身的复杂度并不会凭空消失,而是从一个地方转移到另外一个地方
1117 0
5. JsonFactory工厂而已,还蛮有料,这是我没想到的
羊了个羊系统开发技术实现原理
最基础的牌堆就是一个x*y*z的三维数组,我们可以使用一切方法构造想要的排队形状:柱形、条形、甚至金字塔形。这都不会影响后面程序的实现
羊了个羊系统开发技术实现原理
|
算法 C++
蓝桥杯试题 算法训练 绘制地图 C/C++解法 AC(最近,WYF正准备参观他的点卡工厂。WYF集团的经理氰垃圾需要帮助WYF设计参“观”路线。现在,氰垃圾知道一下几件事情。。。。)
蓝桥杯试题 算法训练 绘制地图 C/C++解法 AC(最近,WYF正准备参观他的点卡工厂。WYF集团的经理氰垃圾需要帮助WYF设计参“观”路线。现在,氰垃圾知道一下几件事情。。。。)
109 0
|
安全 Java 程序员
5. JsonFactory工厂而已,还蛮有料,这是我没想到的(下)
5. JsonFactory工厂而已,还蛮有料,这是我没想到的(下)
5. JsonFactory工厂而已,还蛮有料,这是我没想到的(下)
|
设计模式 JSON 安全
5. JsonFactory工厂而已,还蛮有料,这是我没想到的(上)
5. JsonFactory工厂而已,还蛮有料,这是我没想到的(上)
5. JsonFactory工厂而已,还蛮有料,这是我没想到的(上)