java面試題:陣列的常用演算法實現
阿新 • • 發佈:2019-02-01
package com.bxh.array; public class ArrayTest { private static int max(int m,int n) { return m>n?m:n; } private static int min(int m, int n) { return m>n?n:m; } //遞迴查詢陣列中最大的數 private static int findMax(int[] num,int begin) { // TODO Auto-generated method stub int n=num.length; int len=n-begin; if(len==1){ return num[begin]; }else{ return max(num[begin],findMax(num,begin+1)); } } //直接查詢法:求陣列中一個數字減去它右邊子陣列中的一個數字中最大的差值 private static int getmax(int[] a) { // TODO Auto-generated method stub int n=a.length; if(a==null || n<=1){ return Integer.MIN_VALUE; } int max=Integer.MIN_VALUE; for (int i = 0; i < n-1; i++) { for(int j=i+1;j<n;j++){ if(a[i]-a[j]>max){ max=a[i]-a[j]; } } } return max; } //動態規劃實現差值最大方法 private static int getMax1(int[] a) { // TODO Auto-generated method stub int len=a.length; int[] diff=new int[len]; int[] max=new int[len]; if(a==null || len<=1){ return Integer.MIN_VALUE; } diff[0]=Integer.MIN_VALUE; max[0]=a[0]; for(int i=1;i<len;i++){ diff[i]=max(diff[i-1],max[i-1]-a[i]); max[i]=max(max[i-1],a[i]); } return diff[len-1]; } //對陣列的兩個子有序段進行合併 private static void sort1(int[] a, int mid) { int len=a.length; for (int i = 0; i < mid; i++) { if(a[mid]<a[i]){ swap(a,i,mid); for(int j=mid;j<len-1;j++){ if(a[j+1]<a[j]){ swap(a,i,i+1); } } } } } private static void sort(int[] a, int mid) { // TODO Auto-generated method stub int tmp; for (int i = 0; i < mid; i++) { if(a[mid]<a[i]){ swap(a,i,mid); findRightForMid(a,mid); } } } private static void findRightForMid(int[] a, int mid) { int len=a.length; for(int i=mid;i<len-1;i++){ if(a[i+1]<a[i]){ swap(a,i,i+1); } } } //交換兩個函式 private static void swap(int[] a, int i, int j) { // TODO Auto-generated method stub int tmp; tmp=a[i]; a[i]=a[j]; a[j]=tmp; } //求陣列中兩個元素的最小距離 private static int minDistance(int[] a, int m, int n) { // TODO Auto-generated method stub if(a==null){ return Integer.MIN_VALUE; } int len=a.length; int m_index=-1; int n_index=-1; int min_dist=Integer.MIN_VALUE+1; for(int i=0;i<len;i++){ if(a[i]==m){ m_index=i; } if(n_index>=0){ min_dist=min(Math.abs(n_index-m_index),Math.abs(min_dist)); } if(a[i]==n){ n_index=i; } if(m_index>=0){ min_dist=min(Math.abs(n_index-m_index),Math.abs(min_dist)); } } return min_dist; } public static void main(String[] args) { int[] num={2,3,4,5,5,3,5,7,4,3,2}; System.out.println("=================遞迴查詢陣列中最大的值==================="); int result=findMax(num,0); System.out.println(result); System.out.println("=================動態規劃實現差值最大方法=================="); int max=getMax1(num); System.out.println(max); System.out.println("=================兩個元素中最小距離======================"); System.out.println(minDistance(num,3,5)); System.out.println("=================對陣列的兩個子有序段進行合併==============="); int[] a={1,5,6,7,15,2,4,8,10,13,14}; // sort(a,5); sort1(a,5); for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" "); } } }