微信红包(数组中出现次数超过一半的数字)----腾讯2016研发工程师编程题
2016-07-13 20:01
561 查看
春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。
给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。
若没有金额超过总数的一半,返回0。
测试样例:
这和我在《剑指offer》上做过的一道题类似:数组中出现次数超过一半的数字,是快排和 STL::map 的应用
map 版:
快排版
第二次做:
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 ;
}
};
给定一个红包的金额数组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 ;
}
};
相关文章推荐
- iOS实现微信授权登陆
- 微信支付回调
- 【JEEWX企业号专题】JEEWX与微信企业号对接,激活应用回调模式
- Android开发之模仿微信打开网页的进度条效果(高仿)
- [置顶] 微信红包技术分析
- 没有80端口的备案域名,如何做微信公众平台的开发?本文介绍可以通过任何域名来做开发,www.baidu.com和www.163.com和www.so.com这样的域名都可以
- AngularJS1.x学习(仿微信图片手势缩放效果实现)
- 支付接口 - 微信,支付宝
- 微信native方式支付中body为中文时签名错误解决方法
- 微信支付注意要点(补充ING)
- iOS开发支付集成之微信支付
- 微信公众号开发教程[007]-消息管理-客服消息
- iOS 微信支付
- 安卓非微信内置浏览器中的网页调起微信支付的方案研究
- 外观模式小程序JAVA源代码
- Android -- 真正的 高仿微信 打开网页的进度条效果
- java微信 客服接口-发消息 中文乱码
- 微信hit push hold !!
- 判断是否为微信浏览器的JS代码
- Android封装好的类似于RadioGroup的底部导航或顶部导航、仿微信底部导航