2016年模拟笔试题--微信红包问题
算法思路:
首先,我们需要统计每个红包金额出现的次数。可以使用一个字典来记录每个金额出现的次数。
然后,我们遍历字典中的每一个键值对,如果当前红包金额出现的次数超过了总红包数的一半,就找到了那个红包金额。
代码实现:
def find_red_packet(red_packets):
count_dict = {} 用来记录每个红包金额出现的次数 for packet in red_packets:
if packet in count_dict:
count_dict[packet] +=1 else:
count_dict[packet] =1 for packet, count in count_dict.items():
if count > len(red_packets) /2:
return packet测试代码:
red_packets = [1,2,3,2,2,2]
print(find_red_packet(red_packets)) 输出2red_packets = [1,2,3,3]
print(find_red_packet(red_packets)) 输出3red_packets = [1,2,3,3,3]
print(find_red_packet(red_packets)) 输出3代码解析:
1. 首先我们定义一个字典count_dict来记录每个红包金额出现的次数。
2. 遍历red_packets中每一个红包金额,如果该金额已经在count_dict中,就将它对应的值加1;如果不在count_dict中,就将它作为一个新的键,值为1。
3. 遍历count_dict中每一个键值对,如果某个红包金额出现的次数大于红包总数的一半,就返回该红包金额。
4. 如果没有找到满足条件的红包金额,就返回None。
算法分析:
该算法的时间复杂度为O(n),其中n为红包数量。第一个for循环遍历一次红包列表,将每个红包金额的出现次数记录在字典count_dict中;第二个for循环最多遍历red_packets中的不同金额的个数,即O(k),其中k为不同金额的个数。因此,该算法的时间复杂度为O(n+k)。在最坏的情况下,所有红包金额都不同,即k=n,那么时间复杂度为O(2n),即O(n)。
该算法的空间复杂度为O(k),即红包金额的种类数。因为我们需要使用一个字典count_dict来记录每个金额的出现次数。