蚂蚁笔试0509,思路分享

这次蚂蚁笔试感觉比阿里简单点,选择就不说了,随缘选。

编程本人:2.9/3,主要卡在第二题,下面分享个思路吧:

1.找第i个不带重复数字的16进制数字

解法:直接暴力找即可。

注意:16进制里的字母要大写,刚开始弄成小写,只能过40%,改成大写就100%了

2.对于一组数字,有些数字的某些位置被“?”覆盖了,“?”可以是任意数字,找极差最大情况。

解法:分享个暴力思路:先把没“?”的存起来,找最大最小值,然后在把有“?”的数字字符串存起来,根据字符串大小排序。

比如:[1, 12, ??8, ?, 1?], 改成 [1, 12]+[??8, ?, 1?]

则最大数为??8改成998,最小数为?改成0,输出极差998

注意:这里有个问题没考虑,就是对于带?的数字,他只能变最大值,或者变最小值,变一次就不能再变了。刚开始没注意这种情况,最后没时间改了,只通过90%。

3.定义好串,当且仅当每个字母出现的次数均为偶数。计算该字符串有多少子序列是好串?(子序列在原串中可以不连续)。例如,"arcaea"的子序列有"aaa"、"ace"等等。

解法:排列组合问题。

1.对于一个字符串 ,先计算出每个字符出现的个数。

2.让每个字符出现偶数次的组合相乘(0次,2次,4次,……)就是答案。

也就是说:ans =(字符1出现0次+字符1出现2次+...)*(字符2出现0次+字符2出现2+...)*……*(字符n……)

3. 对应字符a,他的个数为n,可以用组合公式写为:ans = C(n,0)+C(n,2)+C(n,4)+...+C(n,n) * 其他字符组合数

4.由于二项式定理:C(n,0)+C(n,2)+C(n,4)+...+C(n,n)(如果n是奇数,这里就是n-1)=2^(n-1)

5 综上所述,令n为字符个数的列表,则 ans = 2^(n[i]-1)

s = "arcaea"
M = 10*9+7
dic = {}
for i in s:
  dic[i] = dic.get(i,0) + 1
ans = 1
for k, v in dic.items():
    ans *= 2**(v-1)
    ans %= M
# 保证结果大于0
print((ans - 1 + M) % M)

#蚂蚁校招##蚂蚁2024暑期实习##蚂蚁笔试##蚂蚁##暑期实习#
全部评论
老兄之前不是去美团了嘛
点赞 回复
分享
发布于 2023-05-10 14:32 北京

相关推荐

点赞 评论 收藏
转发
3 7 评论
分享
牛客网
牛客企业服务