数学知识对写程序有用吗?

对于这个标题,答案我是持肯定态度的,有的人可能说数学一般用于解决一些高端算法,我们测试脚本,哪用得上啊,其实也不然,适当的思考,适当的运用一些数学知识,可以使我们的测试脚本更加的有档次,效率也会更高,或者说也会更加易懂,我们来看一下下面这个方法:

计算从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);
	}

}

 所以,数学好的人,对于写程序是有很大帮助的!

 

以上只是我的个人观点,请大家多多指教!

posted on 2015-05-18 12:04  张飞_  阅读(1076)  评论(3编辑  收藏  举报

导航