数学知识对写程序有用吗?
对于这个标题,答案我是持肯定态度的,有的人可能说数学一般用于解决一些高端算法,我们测试脚本,哪用得上啊,其实也不然,适当的思考,适当的运用一些数学知识,可以使我们的测试脚本更加的有档次,效率也会更高,或者说也会更加易懂,我们来看一下下面这个方法:
计算从1加到100的值。
估计我们做测试的,很多人第一眼想到的就是用一个for循环,然后sum +=i; 这样就可以得出值了,有的人还可以再加以改善后,搞成一个通用的方法,可以计算任何连续块的值。这些都是OK的,都可以得出结论,但是,换个思路,如果用到数学中的一个公式:
(上底+下底)*高/2,利用这个公式,稍微的改下代码,判断下长度的奇偶,即可以得出结果,没用到任何循环,这个的效率显然要快,且应该也更易懂吧?
可能有的人会觉得这个例子不够直接,我们再来看下面的一道题:
有一个数组,任意移动K位后,输出数组,比如[1,2,3,4,5],移动两位后,就是[4,5,1,2,3].
如果在面试中,碰到这个题,你会如何解?告诉面试官,循环K次,每次重新的去计算数组?如果答案是这样,估计面试分数会有所影响。我们不妨来分析下:
1. K位,这个K位可以大于数组长度,也可以小于数组长度,上面的数组中,移动5次后,就与原始数组一样的了,所以,5是一轮,如果K等于6,实际上与移动1位是一样的效果,所以,我们只需把K与数组长度取模,即可得出实际要移动的位数了。
2. 得出移动位数后,我们就可以循环数组,然后根据当前的index与移动位数的关系,来产生一个新的数组
3. 当前index与移动位数的关系:实际移动位数+当前index,小于与大于的处理关系是不一样的,大于时,要减去数组长度,否则,就会越界了!
最后来看一下具体的代码:
package com.demo; public class Test16 { public void reindexArray(int[] arr, int step) { int len = arr.length; int s = step % len; int[] a = new int[len]; for (int i = 0; i < len; i++) { if(i+s<arr.length){ a[i+s] = arr[i]; }else{ a[i+s-len] = arr[i]; } } for (int i : a) { System.out.println(i); } } public static void main(String[] args) { Test16 t = new Test16(); t.reindexArray(new int[] { 1, 2, 3, 4, 5 }, 2); } }
所以,数学好的人,对于写程序是有很大帮助的!
以上只是我的个人观点,请大家多多指教!
百度阅读电子书地址:http://yuedu.baidu.com/ebook/f6dbb2a2f01dc281e53af0f3
讨论QQ群:536192476
个人公众号: