首页 > 代码库 > 每日一记--2014.9.15

每日一记--2014.9.15

今天的程序还有待改进,写的可能比较冗长了,虽然逻辑不难,自己也是debug了一会儿。

问题是:找数值中的主元素,即个数超过半数的元素。

首先找出唯一的一个候选元素,然后再遍历数值统计其个数,看是否大于数组长度的二分之一,如大于则返回此主元素,若小于则表明没有主元素那么返回-1(假设数组中的数均为正整数)。

如何寻找唯一的候选元素:

      1.利用递归

      2.为找出A中的候选元,先构造B。逐次比较A中的两个元素:比较A1和A2,若相等,则放入B;否则什么也不做。然后比较A3和A4,若相等,则放入B;否则什么也不做。依次方式继续直到读完整个A(当A中有奇数个元素时,则将最后一个元素直接放入B中)然后寻找B中的候选元素。一直递归下去,直到B中只剩一个候选元素为止,或者B中元素为0个,则证明没有主元素。

      

 1 package mainElement; 2  3 public class MainElement { 4  5     public static void main(String[] args) { 6         // TODO Auto-generated method stub 7         int[] aa = new int[] {5,2,3,5,5,5,1,7,5,9,5}; 8         System.out.println(findMain(aa,aa.length)); 9     }10 11     private static int findMain(int[] aa, int length) {12         int mainEle = findMainCandi(aa,length);13         if(mainEle!=-1){14             int count=0;15             for(int i=0;i<length;i++){16                 if(aa[i]==mainEle)17                     count++;18             }19             if(count>(length/2)){20                 return mainEle;21             }else{22                 return -1;23             }24             25         }else{26             return -1;27         }28         29     }30 31     // 如果有候选主元素就返回此候选,如没有返回-132     33     private static int findMainCandi(int[] aa,int len) {34         // TODO Auto-generated method stub35        if (len == 1) {36             return aa[0];37         } else {38             int length =0;39             int[] bb = new int[len];40             if (len % 2 == 0) {41                 int j=0;42                 for (int i = 0; i < len; i = i + 2) {43                     if (aa[i] == aa[i + 1])44                         bb[j++] = aa[i];45                 }46                 if(j==0)47                     return -1;48                 else49                     length=j;50             } else {51                 int j=0;52                 for (int i = 0; i < len - 1; i = i + 2) {53                     if (aa[i] == aa[i + 1])54                         bb[j++] = aa[i];55                 }56                 bb[j] = aa[len - 1];57                 length=j+1;58             }59             return findMain(bb,length);60         }61     }62 }

 

每日一记--2014.9.15