您的位置:首页 > 移动开发 > 微信开发

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

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

给定一个红包的金额数组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 ;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: