我们给出
N
个单词,每个单词的长度最大为50.所有单词由小写字母和数字组成,然后我们连接所有N个单词以形成一个更大的字符串A.An无限字符串{{1通过在递归上对A执行无限步骤来构建:在第i步中,A与S
连接i次,然后反转A.例如:设N为3,每个字为' 1&#39 ;,' 2'和' 3'在连接之后,我们得到′$′
与A= 123
相反,并且在第一次递归时它将是。321
A=123$321
在第二次递归时它将是A=123$321$$123$321
依此类推......这样获得的无限字符串是S.Now在第i次递归之后我们必须找到索引处的字符k.Now递归可以大到{ {1}}和pow(10,4)
可以大到N
,每个单词的长度最大为50,所以在最坏的情况下,我们的起始字符串的长度可以是(pow(10,4))
所以递归并添加字符串不会起作用。
我想到的是,在第一次递归之后字符串将是一个回文,所以如果我可以计算' $' * II的pos可以计算任何索引,因为它之前和之后的字符串是一个回文。我想出了一个模式 看起来像这样:
5*(10**5)
输出:
string='123'
k=len(string)
recursion=100
lis=[]
for i in range(1,recursion+1):
x=(2**(i-1))
y=x*(k+1)+(x-i)
lis.append(y)
print(lis[:10])
现在我有两个问题首先我还要添加相邻的位置' $'在列表中,因为在第8位是第二次递归之后会有更多(递归-1)= 1更多' $'在第9位,同样第17位是第3次递归,将会有(3-1)两次' $'在位置18和19,这将继续直到第i个递归,为此我将不得不插入while循环,这将使我的算法给出TLE
[4, 8, 17, 36, 75, 154, 313, 632, 1271, 2550]
输出:string='123'
k=len(string)
recursion=100
lis=[]
for i in range(1,recursion+1):
x=(2**(i-1))
y=x*(k+1)+(x-i)
lis.append(y)
count=1
while(count<i):
y=y+1
lis.append(y)
count+=1
print(lis[:10])
找到[4, 8, 9, 17, 18, 19, 36, 37, 38, 39]
的位置背后的想法是它前后的字符串是一个回文,如果$
的索引是奇数,那么它之前和之后的元素将是它的最后一个元素。字符串,它甚至是元素之前和之后的元素。
答案 0 :(得分:1)
这是我对问题的解决方案(索引从1开始,对于findIndex)我基本上是递归计数以找到findIndex元素的值。
def findInd(k,n,findIndex,orientation):
temp = k # no. of characters covered.
tempRec = n # no. of dollars to be added
bool = True # keeps track of if dollar or reverse of string is to be added.
while temp < findIndex:
if bool:
temp += tempRec
tempRec += 1
bool = not bool
else:
temp += temp - (tempRec - 1)
bool = not bool
# print(temp,findIndex)
if bool:
if findIndex <= k:
if orientation: # checks if string must be reversed.
return A[findIndex - 1]
else:
return A[::-1][findIndex - 1] # the string reverses when there is a single dollar so this is necessary
else:
if tempRec-1 == 1:
return findInd(k,1,findIndex - (temp+tempRec-1)/2,False) # we send a false for orientation as we want a reverse in case we encounter a single dollar sign.
else:
return findInd(k,1,findIndex - (temp+tempRec-1)/2,True)
else:
return "$"
A = "123" # change to suit your need
findIndex = 24 # the index to be found # change to suit your need
k = len(A) # length of the string.
print(findInd(k,1,findIndex,True))
我认为这也会满足你的时间限制,因为我没有通过每个元素。
答案 1 :(得分:1)
S 每组中的美元符号数量遵循以下顺序:
1 2 1 3 1 2 1 4 1 2 1 ...
这对应于 i 在其二进制表示中具有的尾随零的数量加上一个:
bin(i) | dollar signs
--------+-------------
00001 | 1
00010 | 2
00011 | 1
00100 | 3
00101 | 1
00110 | 2
... ...
使用该信息,您可以使用从 k 中减去原始单词大小的循环,然后根据上述观察结果减去美元数。通过这种方式,您可以检测 k 是否指向一美元或一个单词。
一旦 k 已经“归一化”到原始总字数长度范围内的索引,只会检查字符是否处于正常顺序或反转。这取决于上述循环中完成的迭代次数,并且对应于 i ,即它是奇数还是偶数。
这导致了这段代码:
def getCharAt(words, k):
size = sum([len(word) for word in words]) # sum up the word sizes
i = 0
while k >= size:
i += 1
# Determine number of dollars: corresponds to one more than the
# number of trailing zeroes in the binary representation of i
b = bin(i)
dollars = len(b) - b.rindex("1")
k -= size + dollars
if k < 0:
return '$'
if i%2: # if i is odd, then look in reversed order
k = size - 1 - k
# Get the character at the k-th index
for word in words:
if k < len(word):
return word[k]
k -= len(word)
你会这样称呼它:
print (getCharAt(['1','2','3'], 13)) # outputs 3
当你需要请求多个这样的字符时,创建一个生成器可能会更有趣,只要你继续迭代就会生成下一个字符:
def getCharacters(words):
i = 0
while True:
i += 1
if i%2:
for word in words:
yield from word
else:
for word in reversed(words):
yield from reversed(word)
b = bin(i)
dollars = len(b) - b.rindex("1")
yield from "$" * dollars
例如,如果您想要从“a”,“b”和“cd”构建的无限字符串中的前80个字符,则将其称为:
import itertools
print ("".join(itertools.islice(getCharacters(['a', 'b', 'cd']), 80)))
输出:
abcd$dcba$$abcd$dcba$$$abcd$dcba$$abcd$dcba$$$$abcd$dcba$$abcd$dcba$$$abcd$dcba$