1000个苹果要分到10个箱子中去 两种分析方式

前些日子接到了一个Java开发的电话面试,接了电话人家开门见山就直接说现在是否方便,什么什么时候收到您的简历投递,是否可以进行电话面试,如果可以就可以直接开始了,emmm,这么突然,也没好意思问公司名称是啥,招的是中级还是高级,算了,直接上车吧,心里想着面试结束了问问公司名称,然后去招聘网站上查下招聘职位,一共面试了大概一个半小时,面试快结束的时候聊一些其他的才知道人家招的是Java高级开发。 

面试问了好多,从数据结构到算法,从框架源码到系统设计,从javaSE基础到多线程、某些业务场景下解决高并发等等...  各种问题,就不一一列举了,在这里只分析一下一个有趣的智力题——分箱子问题。

问题:

有1000个苹果要分到10个箱子中去,每个箱子苹果数量可能相等可能不相等,这个不做限制,要求10个箱子把1000个苹果全部装完,不能有剩余,然后我想要任意数量的苹果(1~1000),都能在不拆开箱子的情况下搬箱子满足我的需要,这10个箱子应该怎么分配苹果数量?

这个问题其实网上也有不少人给出答案,但是给出详细分析的非常少,这里给出两种分析方式。

①、模拟分析法

其实单从这个问题出发,我们可以去模拟这个问题场景,比如我想要一个苹果,那么一定有个箱子里面只装了一个苹果,这种场景只有一种情况。如果我想要两个苹果,这种场景方案就不止一种,我可以搬来你给个箱子,每个箱子里面装一个苹果,也可以只搬一个箱子,里面装了两个苹果,但是我们可以猜想,如果采用第一种方案,两个箱子,每个箱子里面装一个苹果,这种方案很可能就满足不了题意—需要把1000个苹果都装完,同理,如果我想要三个苹果,如果采用三两个箱子,每个箱子里面装一个苹果,那么这种装法就一定不会吧1000个苹果全部装完,所以是不可行的,所以我们猜想(先做猜想然后验证)一种应该可行的大致方案应该是装最多的,比如我想要两个苹果,就不采用两个箱子分别装一个,就直接拿出一个箱子装两个,如果我需要三个苹果,那么我只需要搬出装一个苹果的箱子和装两个苹果的箱子就行了,如果我想要四个苹果,现在只有装一个苹果的箱子和装两个苹果的箱子不能满足,那么我再拿出一个箱子装四个苹果就行了,以此类推,只要不能满足我的要求的就重新拿出一个箱子装我想要的。

下面给出了一个图示:

从图示不难看出只要我想要511之内的苹果,根本不用去动第十个箱子,前九个箱子已经能够满足我的需要,比如我想要286个苹果,首先我们找在上图这样放的方式中比286小的第一个数也就是256,把256这个箱子搬出来,然后还需要找30个苹果,然后在上图这样放的方式中比30小的第一个数也就是16,把16这个箱子搬出来,继续还需要14个苹果,依次类推找出8、4、2,好了,现在箱子已经搬完了,也就是256+16+8+4+2=286,正好满足我们的需要。

②、二进制分析法

其实从第一种方式中我们能够明显的看出这组数列是有规律的,都是连续几个2相乘的结果,而2的x次方其实正是二进制的形式,当然,对于这道题我们这样觉得是在已经有第一种这个结果的情况下看出来的,如果刚接触这个题,其实我们会想这道题的目的就是用十个数(和为1000)去枚举1000以内的任意一个数,对于枚举任意一个数,这个数无非两种:奇数和偶数。而对于奇数和偶数又恰恰有这样的规律:任意一个偶数都可以拆分成几个2的次方的数进行相加,任意一个奇数 都可以拆分成几个2的次方的数进行相加再加1(其实就是加2^0),比如12=8+4=1000+100,18=16+2=10000+10,17=16+1=10000+2^0=10000+1,有了这样一个规律,意思就是我们可以用一系列2的次方也就是二进制去枚举一个范围内的数据,比如1~16内的数据我们可以用以下二进制直接取出来或者几个相加得到结果

1

10

100

1000

其实不难发现,1、2、4、8正好对应第一种方式装8个苹果那个箱子能够命中的我们想要的数量。对于本题1000个苹果10个箱子,用二进制模拟大致如下:

1
        10
        100
        1000
        10000
        100000
        1000000
        10000000
        100000000
        111101001        489

从1~100000000能够枚举的数范围为1~511,只要大于511,我们就从489中补,然后剩余的总能够在1~511范围内命中,比如我们需要600个,首先从489中取,还剩余111个,111已经在1~511范围内了一定会被命中有解,当我们需要1000个的时候其实就是个临界点,先取489,还需要511个,1~511的右边界恰恰能够保证我们能够取到有解。

分箱子类似问题其实并不少见,恕自己见识短浅,二进制还有常见的考察二进制异或、移位计数等,慢慢学习积累吧。

 

更多内容持续更新中,感兴趣的朋友请移步至个人公众号,谢谢支持😜😜......

公众号:wenyixicodedog

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值