牛客腾讯笔试题真题题解
- 格雷码
# -*- coding:utf-8 -*-
class GrayCode:
def getGray(self, n):
GrayList = []
tmp_list_0, tmp_list_1 = [],[]
if n <1 :
return None
elif n == 1:
GrayList = ['0','1']
return GrayList
else:
Prev_list = self.getGray(n-1)
for idx, item in enumerate(Prev_list):
tmp_list_0.append('0'+str(item))
tmp_list_1.insert(0,'1'+str(item))
GrayList = tmp_list_0+tmp_list_1
return GrayList
思路:用递归的思路去解决。找规律,当n大于1的时候,新的GrayCode是n-1时候的GrayCode前+0与+1后的列表倒序concat。
编程细节:在python的类中,在类内部递归需要用self.getGray不然会报错。
- 微信红包
题目描述
春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。
给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。
若没有金额超过总数的一半,返回0。
测试样例:
[1,2,3,2,2],5
返回:2
# -*- coding:utf-8 -*-
class Gift:
def getValue(self, gifts, n):
count = [gifts.count(gift) for gift in gifts]
return gifts[count.index(max(count))] if max(count)>n/2 else
一行写法
from collections import Counter
class Gift:
def getValue(self, gifts, n):
a = Counter(gifts).most_common(1)[0]
return a[0] if a[1] > n // 2 else 0
补充知识
collections.Counter是一个对于各种数据结构的计数器.
>>> from collections import Counter
>>>
>>> myList = [1,1,2,3,4,5,3,2,3,4,2,1,2,3]
>>> print Counter(myList)
Counter({2: 4, 3: 4, 1: 3, 4: 2, 5: 1})
>>>
>>> print Counter(myList).items()
[(1, 3), (2, 4), (3, 4), (4, 2), (5, 1)]
>>>
>>> print Counter(myList).keys()
[1, 2, 3, 4, 5]
>>>
>>> print Counter(myList).values()
[3, 4, 4, 2, 1]
- 编码
题目描述
假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy 其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推。 编写一个函数,输入是任意一个编码,输出这个编码对应的Index.
输入描述:
输入一个待编码的字符串,字符串长度小于等于100.
输出描述:
输出这个编码的index
示例1
输入
baca
输出
16331
思路:
从简单到复杂一步步思考:
aaa+ = 25
aa+* = 25*25+25 = 650
a+** = 650*25+25 = 16275
a*** = 16276
发现这个规律后,我们可以这么去思考一个编码:
每一个
i
1
−
1
i_1-1
i1−1对应着一个16276,也就是包含到
i
1
i_1
i1为止的所有编码。
每一个
i
2
−
1
i_2-1
i2−1对应着一个650,但是只包含到
i
1
i
2
i_1i_2
i1i2而不包含
i
1
i_1
i1本身,所以+1
每一个
i
3
−
1
i_3-1
i3−1对应着一个25,但是只包含到
i
1
i
2
i
3
i_1i_2i_3
i1i2i3而不包含
i
1
i
2
i_1i_2
i1i2,所以+1
每一个
i
4
i_4
i4对应着1,是最小的单位所以有一个算一个全部加上。
所以最后的函数就是:
Res = (i_1-1) * 16275 + ((i_2-1) *650 +i_2) + ((i_3-1)*25 + i_3) + i_4
当然需要考虑 i 234 i_{234} i234不存在的情况,需要在代码中设置好边界条件
import sys
def get_encoding(key):
res = 0
key_num = [ord(char) - 96 for char in key]
saved_list = [16276, 650, 25, 1]
for i in range(min((len(key_num), 3))):
res += (key_num[i]-1) * saved_list[i]
while len(key_num) < 4:
key_num.append(0)
res = res+key_num[1]+key_num[2]+key_num[3]
return res
a = input()
res = get_encoding(a)
print(res)
注意:牛客的输入是input(),输出直接print出来就可以了。
…待续