无限的字符串

时间:2017-10-31 08:00:31

标签: python string python-3.x

  

我们给出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]的位置背后的想法是它前后的字符串是一个回文,如果$的索引是奇数,那么它之前和之后的元素将是它的最后一个元素。字符串,它甚至是元素之前和之后的元素。

2 个答案:

答案 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$