我是Python的新手,我试图通过解决CodeChef上的问题来熟悉它。我试图解决Easy问题Number Game。问题是我的代码的执行时间太长了。
我已经将我编写的Python解决方案翻译成了C ++,并且提交被接受了,所以我知道我有一个正确的答案,它只是一个不变的倍数。
是否有可能在规定的时间内在Python 3中解决此问题?你能帮助我加快我的代码来实现这个目标吗?
import time
def getStartValues(A, M):
startVals = [0]*M
b = [0]*len(A)
for i in range(len(A)-1):
b[i+1] = (10*b[i] + A[i]) % M
f = 0
power = 1
for i in range(len(A)-1,0,-1):
startVals[(b[i]*power + f) % M] += 1
f = (A[i]*power + f) % M
power = (power*10 % M)
startVals[f] += 1
return startVals, power
def checkValues(i, startVals, M, powNm1, checked, chklst):
if checked[i] == 1:
return startVals[i]
q = [i]
chk = [0]*M
chk[i] = 1
while len(q) > 0:
val = q.pop(0)
for j in chklst:
val2 = (powNm1*val + j) % M
if checked[val2] > 0:
checked[i] = 1
return startVals[i]
elif chk[val2] == 0:
q.append(val2)
chk[val2] = 1
return 0
def compute(A, M):
startVals, power = getStartValues(A, M)
checked = [0]*M
checked[0] = 1
chklst = [j for j in range(M) if startVals[j] > 0]
total = 0
for i in chklst:
c = checkValues(i, startVals, M, power, checked, chklst)
total += c
return total
start = time.time()
file = open('numbgame.in', 'r')
#T = int(input())
T = int(file.readline())
for i in range(T):
#A, M = input().split()
A, M = file.readline().split()
A = list(map(int,A))
M = int(M)
print(compute(A, M))
tDiff = time.time() - start
print('Total time: %s' % tDiff)
请注意,为方便起见,我已修改代码以从文件中读取并显示执行时间,并且在提交之前需要进行一些小的更改。
getStartValues接收输入A和(小)整数M的(大)数字列表,并返回模数M,可以通过删除单个数字从A生成。
checkValues采用索引i,列表startValues,整数M,整数powNm1(值10 ^(n-1)mod M,其中n是A中的数字位数,检查的列表保持不变跟踪一个值是否已被确定为可解决的,以及列表chklst(包含索引i,使得startValues [i]> 0)。
大部分时间都花在函数getStartValues上,因为A最长可达10 ^ 6位。在我的桌面上,getStartValues函数调用大约需要1.2秒,而计算函数的其余部分需要大约0.04秒(对于最坏的情况输入)。