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
查看10道真题和解析