一. AcWing 4399. 数字母
https://www.acwing.com/problem/content/4402/
题目分析:
模拟题:用python接收数据,比较方便
a = input()
#边界值
if(a=='{}'):
print('0')
else:
#去掉两边的大括号
a = a[1:len(a)-1]
#分隔取数据
b = list(a.split(', '))
#用到了set集合元素互异特点
s = set()
for i in b:
s.add(i)
print(len(s))
二. AcWing 4400. 玩游戏
https://www.acwing.com/problem/content/4403/
题目分析
模拟题:注意下一个领头人的选择
#n:n个小朋友
#k:游戏进行k轮
n,k = map(int,input().split())
#a存放每一轮数的人数
a = list(map(int,input().split()))
#l存放第1-n个小朋友的编号,用l进行模拟
l = []
for i in range(1,n+1):
l.append(i)
#第一个作为领头人的小朋友
seq = 0
#k轮模拟
for i in range(k):
#target:领头人找到要被淘汰的人编号
target = (seq+a[i])%len(l)
print(l[target],end=' ')
#找到下一个领头人,因为出局者会离开,所以不是target+1
seq = target #这个关键
del l[target]
三. AcWing 4401. 找回数组
https://www.acwing.com/problem/content/4404/
题目分析:
根据对a的描述找到规律
以a = 1,3,5,6,8为例
x长度为l
a0 = 0
a1 = x0+a0 (x0 = a1-a0)
a2 = x1+a1 (x1 = a2-a1)
a3 = x(2 mod l)+a2 (x. = a3-a2)
a4 = x(3 mod l)+a3 (x. = a4-a3)
a5 = x(4 mod l)+a4 (x. = a5-a4)
就是说x的值要是存在,肯定可以通过a推算出来
我的思路就是:
先假设x的长度 = n,把每个x用规律算出来(后项-前项)
然后x的length从1-n遍历,检验是否满足条件
比如:
length=1时,只有x0,就是每个x元素都相等
length=2时,有x0,x1,就是x0和x1和与之下标+2的元素相等
length=3时,有x0,x1,x2,就是x0,x1,x2和与之下标+3的元素相等
......
以此类推,如图:
就是,x要是有长度为length的可能性,由a推出的x数组元素必须满足 元素之间间隔length相等
n = map(int,input())
l = list(map(int,input().split()))
#插入a0元素,保证运算一致性
l.insert(0,0)
#l1:第一步推出的x数组
l1 = []
for j in range(1,len(l)):
l1.append(l[j]-l[j-1])
ans = []
#k从1-n进行循环,看长度为k有没有可能性
for k in range(1,len(l1)+1):
flag = False
#对每个可能的长度k,进行验证的步骤
#进行k次循环,因为x长度为length下,需要验证length个元素
for i in range(k):
#先从第一个元素开始判断,他与和他间隔k的元素是否相等
num = i
#以下算法实现的就是如果判断x里的元素,是否间隔k相等
while(num+k < len(l1)):#下标没有越界再执行循环
if (l1[num] != l1[num+k]):#该分支下,不满足条件
flag = True
break
else:#该分支下满足条件,迭代判断
num = num+k
if flag:
break
if flag == False:
ans.append(k)
print(len(ans))
ans.sort()
for i in ans:
print(i,end=' ')