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

最近看到一个创新工厂的面试题,很有意思,下面给出算法实现(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];

}

时间: 2024-09-21 17:04:40

创新工厂面试题详解:共打了多少鱼的相关文章

java面试题——详解HashMap和Hashtable 的区别_java

一.HashMap 和Hashtable 的区别 我们先看2个类的定义 public class Hashtable extends Dictionary implements Map, Cloneable, java.io.Serializable public class HashMap extends AbstractMap implements Map, Cloneable, Serializable 可见Hashtable 继承自 Dictiionary 而 HashMap继承自Abs

Twitter算法面试题详解(Java实现)

最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看这个图.可以将方块看做砖.题干很简单,问最多能放多少水.例如,图2就是图1可放的最多水(蓝色部分),如果将一块砖看做1的话,图2就是能放10个单位的水. 图2 再看个例子 图3 图3可以放17个单位的水. 上面每一个图的砖墙用int数组表示,每一个数组元素表示每一列砖墙的砖数(高度),例如,图3用数组表示就是int[] w

分享阿里巴巴综合算法面试题详解

这道题的大意是:有一个淘宝商户,在某城市有n个仓库,每个仓库的储货量不同,现在要通过货物运输,将每次仓库的储货量变成一致的,n个仓库之间的运输线路围城一个圈,即1->2->3->4->-->n->1->-,货物只能通过连接的仓库运输,设计最小的运送成本(运货量*路程)达到淘宝商户的要求,并写出代码. 解题思路: 假设n个仓库的初始储货量分别为warehouse[1],warehouse[2],-,warehouse[n] 计算平均储货量  average = (w

javascript 一淘九宫格面试题详解

1 2 3 4 5 6 7 8 9

详解Android App卸载后跳转到指定的反馈页面的方法_Android

很多人也许会问:360被卸载之后会跳转到指定的反馈页面,是怎么弄的? 其实这个问题的核心就在于:应用被卸载了,如果能够做到后续的代码逻辑继续执行 我们再来仔细分析一下场景和流程 一个应用被用户卸载肯定是有理由的,而开发者却未必能得知这一重要的理由,毕竟用户很少会主动反馈建议,多半就是用得不爽就卸,如果能在被卸载后获取到用户的一些反馈,那对开发者进一步改进应用是非常有利的.目前据我所知,国内的Android应用中实现这一功能的只有360手机卫士.360平板卫士,那么如何实现这一功能的? 我们可以把

十七道海量数据处理面试题与Bit-map详解

作者:小桥流水,redfox66,July.   前言     本博客内曾经整理过有关海量数据处理的10道面试题(十道海量数据处理面试题与十个方法大总结),此次除了重复了之前的10道面试题之后,重新多整理了7道.仅作各位参考,不作它用.     同时,程序员编程艺术系列将重新开始创作,第十一章以后的部分题目来源将取自下文中的17道海量数据处理的面试题.因为,我们觉得,下文的每一道面试题都值得重新思考,重新深究与学习.再者,编程艺术系列的前十章也是这么来的.若您有任何问题或建议,欢迎不吝指正.谢谢

海量数据处理面试题与Bit-map详解

十七道海量数据处理面试题与Bit-map详解 作者:小桥流水,redfox66,July. 前言     本博客内曾经整理过有关海量数据处理的10道面试题(十道海量数据处理面试题与十个方法大总结),此次除了重复了之前的10道面试题之后,重新多整理了7道.仅作各位参考,不作它用.     同时,程序员编程艺术系列将重新开始创作,第十一章以后的部分题目来源将取自下文中的17道海量数据处理的面试题.因为,我们觉得,下文的每一道面试题都值得重新思考,重新深究与学习.再者,编程艺术系列的前十章也是这么来的

工厂模式(factory pattern) 详解

工厂方法模式: 定义了一个创建对象的接口, 但由子类决定要实例化的类是哪一个. 工厂方法让类把实例化推迟到子类. 包括: 创建者父类(creator), 包含创建对象的方法(代替new具体的对象, 通过参数创建不同的对象), 和一些基本的方法; 具体创建者(concrete creator), 继承创建者父类, 实现创建对象的方法, 不同参数可以创建不同的对象; 产品类父类(product), 包含产品的基本使用方法, 被创建者父类(creator)的基本方法使用; 具体产品(concrete

抽象工厂模式(abstract factory pattern) 详解

抽象工厂模式: 提供一个接口, 用于创建相关或依赖对象的家族, 而不需要明确指定具体类. 全部代码: http://download.csdn.net/detail/u012515223/7403553 具体方法: 1. 提供一个抽象工厂(abstract factory)接口(interface)类, 不同的具体工厂(concrete factory)继承此类. 代码: /** * @time 2014年5月26日 */ package factory; /** * @author C.L.W