微信红包(C++、Python)
微信红包是在中国传统节日和特殊场合中常见的一种礼物形式。人们通过微信向亲朋好友发送红包,表达祝福和关怀。而在春节期间,小明使用微信收到了很多个红包,非常开心。然而,他在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。现在,小明希望能够找到这个金额。
针对这个问题,我们可以使用哈希表来记录每个红包金额出现的次数。遍历红包记录列表,每次遇到一个金额,就将其作为哈希表的键,并将其对应的值加一。当遍历完所有红包记录后,再次遍历哈希表,找到出现次数超过总数一半的金额。
算法思路:
1. 创建一个空的哈希表,用于记录红包金额出现的次数。
2. 遍历红包记录列表,对于每个红包金额:
- 如果该金额在哈希表中已存在,将该金额对应的值加一。
- 如果该金额在哈希表中不存在,将该金额作为哈希表的键,并将其对应的值设为1。
3. 再次遍历哈希表,找出出现次数超过红包总数一半的金额。返回该金额。
代码实现如下所示:
C++实现:
```cppinclude
include
include
using namespace std;
int findMajorityAmount(vector
unordered_map
int halfCount = redPacketAmounts.size() /2;
for (int amount : redPacketAmounts) {
if (countMap.count(amount)) {
countMap[amount]++;
} else {
countMap[amount] =1;
}
}
for (const auto& pair : countMap) {
if (pair.second > halfCount) {
return pair.first;
}
}
return -1; //未找到}
int main() {
vector
int majorityAmount = findMajorityAmount(redPacketAmounts);
if (majorityAmount != -1) {
cout << "The majority amount is: " << majorityAmount << endl;
} else {
cout << "No majority amount found." << endl;
}
return0;
}
```
Python实现:
```pythondef find_majority_amount(red_packet_amounts):
count_map = {}
half_count = len(red_packet_amounts) //2 for amount in red_packet_amounts:
count_map[amount] = count_map.get(amount,0) +1 for amount, count in count_map.items():
if count > half_count:
return amount return -1 未找到red_packet_amounts = [10,20,10,30,10,40,10]
majority_amount = find_majority_amount(red_packet_amounts)
if majority_amount != -1:
print("The majority amount is:", majority_amount)
else:
print("No majority amount found.")
```
以上代码都是通过遍历红包记录并使用哈希表来统计红包金额出现的次数。遍历过程的时间复杂度为O(n),其中n是红包数量。再次遍历哈希表的时间复杂度为O(m),其中m是不同的红包金额种类数量。因此,总的时间复杂度为O(n+m)。由于哈希表的查找操作平均时间复杂度为O(1),所以算法的效率较高。
通过以上算法和代码实现,小明可以找到在他的红包记录中出现次数超过一半的红包金额。