本帖最后由 龙骑将杨影枫 于 2014-12-5 01:05 编辑
首先我创建了一个名为Pirate的类,包含2个公有属性(懒得再去get和set)。其中gold表示该名海盗在一轮分金中需要分多少钱,isGiven来表示在此轮分金中是否要给他钱。
- public class Pirate {
- public int gold=0;
- public boolean isGiven=false;
- }
复制代码
然后我又创建了一个PirateThinking的类,模拟思考过程。
最后编写一个演示类,进行运行。
- public class Demo {
- /**
- * @param args
- */
- public static void main(String[] args) {
- PiratesThinking pt=new PiratesThinking();
- pt.spilitGold(5);
- }
- }
复制代码
任务完成,经过验证符合推理结果。(注:偷懒,写的定长的数组,最多可以验证10个人)
说明:
1
关于如何从m个数里选出n个比较小的数又不移动他们本身的位置,我采取的是这种办法。
首先取一个足够大的常量(这这次我取的是101,因为只有100块钱,不可能有人会分101块钱),进行遍历比较。如果发现有数比常量小,用此数代替常量。遍历一圈后,即可找到此列数字中最小的一个数,也就是海盗们所应该分的钱。然后我通过findPirateByGold去定位该名海盗,将他的isGiven设为true。isGiven为true的海盗不参与与常量的比较。进行下一轮比较。一共进行m/2轮比较。
2
为何要有抹掉下一个人分配的痕迹操作。因为我是按照递归的方法进行调用,所以如果后面的海盗分完钱,必然会有海盗isGiven是true的情况,会影响到本次分配。因此每递归一次都要将isGiven置空。
3
我本人编程时养成的习惯,写代码前考虑清楚,写代码时分割清楚。宁愿多写几个函数名称,也要把大函数分割成小函数。第一清晰易读。第二降低耦合度,防止一错错一堆。可能诸位现在写还习惯于写在一起。我真诚的建议:模块化函数从现在开始。不然等以后遇到一旦写出超过200行(我本人是100行)的大函数,其他程序员修改调试时会有拿刀劈了你的冲动。
以上就是我在处理海盗分金时的思考过程与编码过程,希望能对大家有所帮助。实际上编程说难不难说简单也很简单,下次如果碰到不知如何下手的问题时,不如先把代码和算法以及对弱智电脑的不满扔到一边。泡杯蜂蜜柚子茶,然后找纸笔划拉划拉,静下心来想想,如果是我,我会怎么处理?
能想清楚,划拉清楚,剩下的就是写代码的功夫,没什么大不了的。 |