每日一记--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     // 如果有候选主元素就返回此候选,如没有返回-1
32     
33     private static int findMainCandi(int[] aa,int len) {
34         // TODO Auto-generated method stub
35        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                 else
49                     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 }

 

posted @ 2014-09-15 22:02  ivywenyuan  阅读(150)  评论(0编辑  收藏  举报