一道笔试题目的算法过程
转贴地址:url
[url] http://blog.csdn.net/caowenbin/archive/2011/03/02/6217976.aspx[/url]
无论是技术笔试还是面试,通常会要求写一点代码或详细描述程序思路,很多应试者都认为自己的回答还算过得去,但往往还是没有了下文。究其原因,既有对试题的轻视,也有平时没有养成良好的思维习惯。其实无论试题的难易程度如何,其背后都可以考核出很多知识点来,比如我们来看这样一道简单的笔试题:
写程序,能够计算组合数 。
这道题太简单了,当我们第一次学程序设计语言的时候可能都写过这个程序,我们一起来看一下这道题的思路过程。
首先想到的是写一个求阶乘的函数,然后再另一个函数中对其调用以计算该组合数。这个思路没有问题,但是能写好代码也不是件容易的事,而且我们应该意识到,招聘方的这道简单的问题很显然是需要我们尽量写得完整的,而不是象征性写出思路,因此,必要的健壮性是要体现出来的。很多人的程序如下:
private static int factorial(int n){ int ret=1; for(int i=2;i<=n;ret*=i++); return ret; } public static int combination1(int all,int select){ return factorial(all)/factorial(select)/factorial(all-select); }
private static int factorial(int n){ if (n<0) throw new InvalidParameterException(); int ret=1; if (n==0 || n==1) return ret; else for(int i=2;i<=n;ret*=i++); return ret; } public static int combination1(int all,int select){ if (select>all || all<=0 || select<=0) throw new InvalidParameterException(); if (select==all) return 1; return factorial(all)/factorial(select)/factorial(all-select); }
public static int combination2(int all,int select){ if (select>all || all<=0 || select<=0) throw new InvalidParameterException(); int ret=1; int begin=0; if (all==select) return ret; //从1-begin之间的数被约分掉以简化计算 if (select<all-select) begin=all-select+1; else begin=select+1; for(int i=begin;i<=all;ret*=i++); //计算分子 for(int i=all-begin+1;i>1;ret/=i--); //被分母除 return ret; }
private static Map<String,Integer> mapTable=new HashMap<String,Integer>();…… public static int combination3(int all,int select){ if (select>all || all<=0 || select<=0) throw new InvalidParameterException(); int ret=1; int begin=0; if (all==select){ return ret; } String tableKey=new String(all+","+select); Integer tableValue=mapTable.get(tableKey); if (tableValue!=null) return tableValue.intValue(); if (select<all-select){ begin=all-select+1; } else{ begin=select+1; } for(int i=begin;i<=all;ret*=i++); for(int i=all-begin+1;i>1;ret/=i--); mapTable.put(tableKey, Integer.valueOf(ret)); return ret;}
private static int[] intTable; …… public static int combination4(int all,int select){ if (select>all || all<=0 || select<=0) throw new InvalidParameterException(); int ret=1; int begin=0; if (all==select){ return ret; } if (intTable!=null && intTable[select]!=-1) return intTable[select]; if (select<all-select){ begin=all-select+1; } else{ begin=select+1; } for(int i=begin;i<=all;ret*=i++); for(int i=all-begin+1;i>1;ret/=i--); if (intTable==null){ intTable=new int[all+1]; for(int i=0;i<all+1;intTable[i++]=-1); } intTable[select]=ret; return ret; }