9.15蚂蚁笔试求大佬解答
好难哦,第二题我不知道我的思路哪里不对呢,只过了25%,求解
第一题:取素因子
小红和小紫拿到一个正整数x,每次选择一个x的因子k(k>1),且k必须是素数,把x除以k。小红先手,谁先不能操作谁输,假设两人足够聪明,请问谁能赢?
输入:
第一行正整数t,代表游戏轮数。
接下来t行每行一个x。
1<=t<=10, 1<=x<=10**9。
输出:
对于每轮,小红赢输出“kou”,小紫赢输出“yukari”
样例:
输入:
2
5
12
输出
kou
kou
第二题:连续上升子数组
一个数组长度为n,对于每个k(1<=k<=n),有多少个长度为k的连续上升子数组?
输入:
第一行n表示数组长度
第二行n个正整数ai
1 <=n, ai<= 2 * 10**5
输出:
n个正整数,代表长度为i的连续上升子数组数量
示例:
输入:
5
2 3 4 4 2
输出:
5 2 1 0 0
其中长度为1的有:[2], [3], [4], [4], [2]。
长度为2的有:[2, 3], [3, 4]。
长度为3的有:[2, 3, 4]。
我的思路就是统计每个最大上升子数组的长度放到一个列表里,比如长度为length,那么对于长度为k的连续上升子数组就应该是k += 1 + length - k,难道不是这么算吗?下面是我的代码,只过了25
n = int(input()) nums = list(map(int, input().split())) temp = [] r = 1 length = 1 while r < n: #算所有的最大连续上升子数组的长度放到temp,只考虑大于1的 if nums[r] - 1 == nums[r - 1]: length += 1 r += 1 else: if length > 1: temp.append(length) length = 1 r += 1 if length > 1: temp.append(length) res = [0] * n res[0] = n for i in temp: length = i for j in range(1, n): if length < j + 1: #下标+1是长度 break res[j] += (1 + (length - j - 1)) #核心计算公式 for j in range(n): res[j] = str(res[j]) print(' '.join(res))
一个好字符串指每个字母出现的次数均为偶数。
问一个字符串中有多少个子序列是好串?
子序列指按顺序取得字母组成的字符串,不一定连续。如:“arcaea”的子序列可以是“aaa”,“ace”等
输入:
小写字母组成的字符串
输出:
好子序列数量,对10**9+7取模后输出
示例:
输入:
ababa
输出:
7