zoukankan      html  css  js  c++  java
  • [编程题] 微信红包


     

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

    给定一个红包的金额数组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.
  • 相关阅读:
    01011_怎么打开任务管理器?win7打开任务管理器方法
    php入门之数据类型
    手把手教你开发jquery插件(三)
    手把手教你开发jquery插件
    php7.0新特性
    Java类和对象的概念
    php新手第一次安装mongo
    什么是SQL游标?
    C#学习笔记2
    转发一篇分析LinQ是什么?
  • 原文地址:https://www.cnblogs.com/chongerlishan/p/6009416.html
Copyright © 2011-2022 走看看