微信红包(数组中出现次数超过一半的数字)----腾讯2016研发工程师编程题

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

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

若没有金额超过总数的一半,返回0。
测试样例:
[1,2,3,2,2],5
返回:2


这和我在《剑指offer》上做过的一道题类似:数组中出现次数超过一半的数字,是快排和 STL::map 的应用 


map 版:

class Gift {
public:
    int getValue(vector<int> gifts, int n) {
        // write code here
        if ( gifts.size() != n ) return -1 ;
        
        map<int, int> m ;
        
        for ( int i = 0; i < gifts.size(); ++ i ) {
            m[ gifts[i] ] ++ ;
        }
        
        for ( map<int, int>::iterator iter = m.begin(); iter != m.end(); ++ iter ) {
            if ( iter->second > ( gifts.size() / 2 ) ) return iter->first ;
        }
        
        return 0 ;
    }
};

快排版


class Gift {
public:
    int getValue(vector<int> gifts, int n) {
        // write code here
        if ( gifts.size() != n ) return -1 ;
        
        QuickSort( gifts, 0, gifts.size() - 1 ) ;
        
        bool isHalf = CheckHalf( gifts ) ;
        
        return isHalf == true ? gifts[gifts.size() / 2] : 0 ;
    }
    
private:
    void QuickSort( vector<int>& vec, int left, int right ) {
        int i = left ;
        int j = right ;
        int pivot = vec[( i + j ) / 2] ;
        
        while ( i - j <= 0 ) {
            if ( vec[i] < pivot ) ++ i ;
            else if ( vec[j] > pivot ) -- j ;
            else {
                int tmp = vec[i] ;
                vec[i] = vec[j] ;
                vec[j] = tmp ;
                ++ i ;
                -- j ;
            }
        }
        
        if ( left < j ) QuickSort( vec, left, j ) ;
        if ( i < right ) QuickSort( vec, i, right ) ;
    }
    
    bool CheckHalf( vector<int>& vec ) {
        int half = vec[ vec.size() / 2 ] ;
        int count = 0 ;
        for ( vector<int>::iterator iter = vec.begin(); iter != vec.end(); ++ iter ) {
            if ( *iter == half ) ++ count ;
        }
        return count > ( vec.size() / 2 ) ? true : false ;
    }
};


第二次做:

class Gift {
public:
    int getValue(vector<int> vec, int n) {
        // write code here
        if ( vec.empty() == true ) return 0 ;
        
        QuickSort( vec, 0, vec.size() - 1 ) ;
        
        int middle = vec[ vec.size() / 2 ] ;
        int tmp = 0 ;
        for ( int i = 0; i < vec.size(); ++ i ) {
            if ( vec[i] == middle ) ++ tmp ;
        }
        
        if ( tmp >= ( vec.size() / 2 ) ) return middle ;
        else return 0 ;
    }
    
private:
    void QuickSort( vector<int>& vec, int left, int right ) {
        int i = left ;
        int j = right ;
        int pivot = vec[( i + j ) / 2] ;
        while ( i - j <= 0 ) {
            if ( vec[i] < pivot ) ++ i ;
            else if ( vec[j] > pivot ) -- j ;
            else {
                int tmp = vec[i] ;
                vec[i] = vec[j] ;
                vec[j] = tmp ;
                ++ i ;
                -- j ;
            }
        }
        if ( left < j ) QuickSort( vec, left, j ) ;
        if ( i < right ) QuickSort( vec, i, right ) ;
    }
};


class Gift {
public:
    int getValue(vector<int> vec, int n) {
        // write code here
        map<int, int> m ;
        for ( int i = 0; i < vec.size(); ++ i ) {
            m[ vec[i] ] ++  ;
        }
        
        for ( map<int, int>::iterator iter = m.begin(); iter != m.end(); ++ iter ) {
            if ( iter->second > ( m.size() / 2) ) return iter->first ;
        }
        
        return 0 ;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值