C/C++_2019_7_26(微信红包 )

想象和勇气都有它的遥远,但无论遥远有多遥远,遥远也有遥远的边界。

题目描述

微信红包 | 时间限制:3秒 | 内存限制:32768K | 语言限制:[Python, C++, C#, Java]

  1. 春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。
  2. 请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。
  3. 给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。若没有金额超过总数的一半,返回0。

测试样例

[1,2,3,2,2],5
返回:2

题目解析

本题题意明确

解题思路

  1. 本题两种思路,第一种排序思路,如果一个数出现次数超过一半了,排序过后,必然排在中间,则最后遍历整个数组查看是否符合即可。
  2. 第二种思路可以用map统计每个数字出现的次数,最后判断有没有超过一半的数字。

示例代码

class Gift{
      
public:    
	int getValue(vector<int> gifts, int n){
             
		sort(gifts.begin(), gifts.end());        
		//超过一半的数排序之后必然排在中间        
		int middle = gifts[n / 2];        
		int count = 0;              
		for(int i = 0; i < n; i++){
                 
			//统计排在中间的数的个数            
			if(gifts[i] == middle){
                     
				count++;            
			}        
		}        
		//如果个数大于一半,则存在超过一半的数        
		if(count > n / 2){
     
			return middle;
		}                    
		else{
     
			return 0;
		}                   
	} 
};
 
/*思路二:map统计*/ 
class Gift {
     
public:    
	int getValue(vector<int> gifts, int n){
     
        map<int,int> count; 
		int middle = gifts.size() / 2;        
		for(const auto& e : gifts){
                 
			++count[e];        
		}        
		for(const auto& e : count){
                 
			if(e.second >= middle){
     
				return e.first;
			}                        
		}        
	return 0;    
	} 
};

你可能感兴趣的:(模拟题)