Ackerman函数的定义为:
{ n+1; m=0,n>0
A(m,n) = { A(m-1,1); n=0,m>0
{ A(m-1,A(m,n-1)) n>0,m>0
求Ackerman(3,8)。
求函数值代码如下, Ackerman(3,8 )=2045。
最正统的解法就是求递推公式了。
四道编程题:
public static int[] multiply(int[] A) { int[] B = new int[A.length]; if(A.length==0) return B; B[0] = 1; for(int i=1;i<A.length;i++) { B[i] = B[i-1]*A[i-1]; } int suf = 1; for(int i=A.length-2;i>=0;i--) { suf *= A[i+1]; B[i] *= suf; } return B; }
public static int twosInFoursFinal(int[] a) { int flag1 = 0,flag2 = 0; for(int i=0;i<a.length;i++) { flag2 ^= flag1&a[i]; flag1 ^= a[i]; } return flag2; }
3. matrix是一个按行递增,按列递增的矩阵。给定元素,判断该元素在矩阵中是否存在。分析算法的时间复杂度。
6 8 10 11 17
public static boolean targetLocate(int[][] matrix,int target) { if(matrix==null||matrix.length==0||matrix[0].length==0) return false; int rows = matrix.length,columns = matrix[0].length; int rdown = 0, rup = rows-1; while(rdown<rows&&matrix[rdown][columns-1]<target) rdown++; while(rup>=0&&matrix[rup][0]>target) rup--; if(rdown>rup) return false; for(int i=rdown;i<=rup;i++) { for(int j=0;j<columns;j++) { if(matrix[i][j]==target) return true; } } return false; }
最坏情况是O(M*N)。
public static Mice[] maxRiseSubSeq(Mice[] M) { Arrays.sort(M,new MiceComparator()); int[] dp = new int[M.length]; dp[0] = 1; int gmax = 0; for(int i=1;i<M.length;i++) { int max = 0; for(int j=0;j<i;j++) { if(dp[j]>dp[max]&&M[j].speed>M[i].speed) { max = j; } } dp[i] = dp[max] + 1; if(dp[i]>dp[gmax]) gmax = i; } ArrayList<Mice> result = new ArrayList<>(); int pre = gmax; result.add(M[gmax]); for(int i=gmax-1;i>=0;i--) { if(M[i].speed>M[pre].speed) { result.add(0, M[i]); pre = i; } } Mice[] m = new Mice[result.size()]; for(int i=0;i<m.length;i++) m[i] = result.remove(0); return m; class Mice{ int weight; int speed; public Mice(int w,int s) { this.weight = w; this.speed = s; } } class MiceComparator implements Comparator<Mice>{ @Override public int compare(Mice o1, Mice o2) { if(o1.weight<o2.weight) return -1; else if(o1.weight>o2.weight) return 1; else return 0; } }