[编程题] 微信红包


 

春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。

给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。

若没有金额超过总数的一半,返回0。

测试样例:
[1,2,3,2,2],5
返回:2
思想:这个算法的时间复杂度是O(n),另外用了两个辅助变量。
     k用于临时存储数组中的数据,j用于存储某个数出现的次数。
     开始时k存储数组中的第一个数,j为0,如果数组出现的数于k相等,则j加1,否则就减1,如果j为0,就把当前数组中的数赋给k
     因为指定的数出现的次数大于数组长度的一半,所有j++与j--相抵消之后,最后j的值是大于等于1的,k中存的那个数就是出现最多的那个数。
code
 public int getValue(int[] gifts, int n) {
        int k = gifts[0], j= 1; 
        for(int i = 1;i<n;i++){
             if(j==0)
                 k=gifts[i];
             if(gifts[i]==k)
                 j++;
             else j--;
         }
             
         if(j>1)
             return k;
         else 
             return 0;
    }
Jumping from failure to failure with undiminished enthusiasm is the big secret to success.
原文地址:https://www.cnblogs.com/chongerlishan/p/6009416.html