蚂蚁0915算法岗笔试题解

T1:一个整数x,小红小紫每次可以选择x的一个因子k(要求k为素数)。小红先手,谁先不能操作谁输,问谁赢谁输?
思路:求x的所有质因子个数
import math

def divide(n):
    res = 0
    for i in range(2, int(math.sqrt(n))+1):
        while n % i == 0:
           res += 1
           n = n // i
    if n > 1:
        res += 1
    return res

x = int(input())
ans = divide(x)
if ans % 2:
    print('xiaohong')
else:
    print('xiaozi')


T2:给定一个长度为n的数组,对于每个k,k∈[1, n],求有多少个长度为k的连续上升子数组?
eg:2 3 4 4 2, 长度为1的有[2], [3],...,[2]共5个,长度为2的有[2,3], [3,4]共2个,长度为3的有[2,3,4]共1个,没有长度为4和为5的。返回[5,2,1,0,0]
思路:dp求出以每个元素为结尾的最长连续上升子数组长度l。那么长度为 [1, l ] 的子数组个数都要+1。得到所有长度集合后,用双指针+dp的技巧计算长度数组可以将o(n^2)复杂度降为o(nlogn)。
from collections import Counter

n = int(input())
nums = list(map(int, input().split()))
ans = [0]*n
dp = [1]*n
for i in range(1, len(nums)):
    if nums[i] > nums[i-1]:
        dp[i] += dp[i-1]
count = Counter(dp)
count = sorted([(k,v) for k,v in count.items()], reverse=True)
ans = [0]*(n+1)
i, j = 0, n
while i < len(count) and j >= 0:
    while j >= count[i][0]:
        j -= 1
    ans[j] = ans[j+1] + count[i][1]
    i += 1
print(' '.join(map(str, ans[:-1])))




T3:定义字符串中每个字母出现的次数是偶数为好串,问对于一个字符串,有多少子序列是好串(子序列可以不连续)?
eg:"ababa"有"aa"4个,"bb"1个,"abab"1个,"abba"1个,"baba"1个
思路:统计字符串中的各字母数,然后排列组合算所有可能数。例如a有5个,那么可以选择4个a,2个啊,0个a,对应是C54+C52+C50的总可能数,其他字母也一样,然后相乘就行。
拓展:可以思考一下如果子串为连续串的做法,状态前缀+动态哈希能搞定[之前微软笔试碰到过]
from collections import Counter
from functools import reduce
import math

MOD = 10**9+7
strings = input()
scount = Counter(strings)
cntlist = [v for k, v in scount.items()]
computelist = []
for cnt in cntlist:
    p = cnt
    if cnt % 2:
        p -= 1
    comp = 0
    for i in range(p, -1, -2):
        comp += math.comb(cnt, i) ## compute C cnt i
    computelist.append(comp)
ans = (reduce((lambda x, y: x*y), computelist) - 1) % MOD
print(ans)


#蚂蚁笔试##阿里笔试##逃离互联网#
全部评论
第二题不是一个树的题吗
点赞 回复 分享
发布于 2022-09-16 11:36 四川
hi~同学,秋招遇“寒气”,牛客送温暖啦!23届秋招笔面经有奖征集中,参与就得牛客会员7天免费体验,最高赢300元京东卡!戳我去看>>>https://www.nowcoder.com/link/zhengjipinglun
点赞 回复 分享
发布于 2022-09-19 15:35 北京

相关推荐

面试摇了我吧:啊哈哈面试提前五个小时发,点击不能参加就是放弃
点赞 评论 收藏
分享
10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 17:16
科大讯飞 算法工程师 28.0k*14.0, 百分之三十是绩效,惯例只发0.9
点赞 评论 收藏
分享
2 18 评论
分享
牛客网
牛客企业服务