马驹各有多少只?关于代码优化……
关于优化我虽然工作了2年,但是很惭愧的说我从来不曾重视过,直到昨天我空闲没事看到一个题目,我们的老大说代码可以更加优化,但是我很肯定的说这个就很优化了(PS:第一种就是我写的);但是在和我们老大讨论后得到如下的结果。
这是一个很经典,但是不难的问题。对于学习JS中for循环的理解还是非常经典的例子。
问题:请问有100件货物,和100匹马,其中大马一匹可以驼3件货物,青年马一匹可以驼2件货物,小马驹2匹可以驼一件货物,请问大马、青年马、小马驹分别有多少只?
话说这个题目并不难,但是大家有没有想过这个题目我们在写JS代码的时候计算结果后,计算机运行了多少次呢?
下面给大家看一组数据如下:
第一种解法:
思路分析:
- 首先我们知道如果全部是大马那么最多有33只也就是i<=33;
- 青年的骏马一匹可以拉2件货物,那么最多50只;
- 小马驹两匹可以拉一件货物,但是马一共有100只,那么最多也就100只对吧;
- 货物只有100件,所有的马驹一共100匹,这是我们的判定条件。
var sum=0; for(var i=0; i<=33; i++){ for(var j=0; j<=50; j++){ for(var k=0; k<=100; k++){ sum++; if(((i*3+j*2+k/2)==100)&&((i+j+k)==100)){ document.write('大马'+ i+ '只'+','+ '青年马'+j+'只'+','+'小马驹'+k+'只'+';'+'<br /><br />'); } } } }; document.write('第一次共计循环了'+'<span style="color: red; font-weight: bold;">'+sum+'</span>'+'次');
输出的结果如下一共七中答案:
- 大马2只,青年马30只,小马驹68只;
- 大马5只,青年马25只,小马驹70只;
- 大马8只,青年马20只,小马驹72只;
- 大马11只,青年马15只,小马驹74只;
- 大马14只,青年马10只,小马驹76只;
- 大马17只,青年马5只,小马驹78只;
- 大马20只,青年马0只,小马驹80只;
第一次共计循环了175134次
第二种解法:
思路分析:
- 首先我们知道如果全部是大马那么最多有33只也就是i<=33;
- 这里的思路我们发生了变化,因为当执行完第一次的for语句后,那么青年的马匹最多就变成了 j<=(100-i*3)/2;
- 小马驹两只可以拉一件货物,那么第三层的for循环里面我们根据上面两层得知 k<=(100-i-j);
- 货物只有100件,所有的马驹一共100匹,这是我们的判定条件。
sum=0; for(var i=0; i<=33; i++){ for(var j=0; j<=(100-i*3)/2; j++){ for(var k=0; k<=(100-i-j); k++){ sum++; if(((i*3+j*2+k/2)==100)&&((i+j+k)==100)){ document.write('大马'+ i+ '只'+','+ '青年马'+j+'只'+','+'小马驹'+k+'只'+';'+'<br /><br />'); } } } }; document.write('第二次次共计循环了'+'<span style="color: red; font-weight: bold;">'+sum+'</span>'+'次');
输出的结果如下:
大马2只,青年马30只,小马驹68只;
大马5只,青年马25只,小马驹70只;
大马8只,青年马20只,小马驹72只;
大马11只,青年马15只,小马驹74只;
大马14只,青年马10只,小马驹76只;
大马17只,青年马5只,小马驹78只;
大马20只,青年马0只,小马驹80只;
第一次共计循环了64872次
第三种解法:
思路分析:
- 首先我们知道如果全部是大马那么最多有33只也就是i<=33;
- 这里的思路我们发生了变化,因为当执行完第一次的for语句后,那么青年的马匹最多就变成了 j<=(100-i*3)/2;
- 小伙伴们有没有发现这里少了一层for循环,因为这里我们已经确定了小马驹的个数就是 k=100-i-j 凡是不符合的直接跳过了;
- 货物只有100件,所有的马驹一共100匹,这是我们的判定条件。
sum=0; for(var i=0; i<=33; i++){ for(var j=0; j<=(100-i*3)/2; j++){ k=100-i-j; sum++; if(((i*3+j*2+k/2)==100)&&((i+j+k)==100)){ document.write('大马'+ i+ '只'+','+ '青年马'+j+'只'+','+'小马驹'+k+'只'+';'+'<br /><br />'); } } }; document.write('第二次次共计循环了'+'<span style="color: red; font-weight: bold;">'+sum+'</span>'+'次');
输出的结果如下:
大马2只,青年马30只,小马驹68只;
大马5只,青年马25只,小马驹70只;
大马8只,青年马20只,小马驹72只;
大马11只,青年马15只,小马驹74只;
大马14只,青年马10只,小马驹76只;
大马17只,青年马5只,小马驹78只;
大马20只,青年马0只,小马驹80只;
第一次共计循环了884次
代码经多后面两次改造,循环的次数直接差了190多倍。很惊讶吧。可以想象一下如果是数据量很大的情况下,代码如此优化是不是在运行速度上带来很大的提升呢。问题虽然简单,但是给我们一个很明确的提示就是代码的优化在性能上提升的速度不可小觑。
PS: 也许小伙伴有更厉害的优化方法,期待你们的答案。