让我们将以1开头的数字的平方连接起来。那么,这个字符串中的第n位是什么?
例如,第10位数字是4。
1 4 9 16 25 36 49 64 81
这只是我普通思维中的一个普通问题。今晚如何解决才能睡得好?有没有不需要循环的算法?
您可以通过获取10的幂次方的平方根来枚举在该序列中有多少个1位数、2位数、3位数等数字,以此确定第n个数字所属的数。从那里开始,这应该相当简单。
这应该是O(log n)复杂度。
n
变得非常大,数值不准确可能会导致迭代计算发散。 - Oliver Charlesworthceil(log10(x+1))将给出数字中的位数。遍历平方数,计算总长度的数量,并一旦达到或超过目标长度n,就知道您需要最后一个数字的第m个数字,其中m是某个数字(易于计算)。通过除以10m-1然后使用模10获取此数字的第m个数字。
总体而言,空间开销恒定,运行时间为O(n)。
def _countup(n):
while True:
yield n
n += 1
def get_nth_element(n):
i = 0 # Initialized just to keep track of iterations.
final_string = ''
cu_generator = _countup(0)
while True:
num = cu_generator.next()
final_string += str(num * num)
if len(final_string) > n:
print "Number of iterations %s" % i
return final_string[n]
i += 1
RUN:
>>> get_nth_element(1000)
Number of iterations 229
'2'
>>> get_nth_element(10000)
Number of iterations 1637
'7'
Haskell中的惰性无限列表使得这个表达式变得非常简单。
ghci> concat [show $ i*i | i <- [1..]] !! 9 '4'
concatMap (show . (^2)) [1..]
- user395760[1..] >>= show . join (*)
:) - ephemient这是 ephemient 的 Haskell 答案直接移植到 Scala 的版本
Iterator.from(1).flatMap(x=>(x*x).toString.iterator).drop(9).next
返回 4
O(n)
Iterator.from(1)
创建一个无限迭代器,计数为 1,2,3,4,....
。(x*x).toString
计算其中每个数的平方并将其转换为字符串。flatMap( ... .iterator)
将它们连接起来,成为一个无限的字符迭代器。drop(9)
从迭代器中删除前9个元素(索引从0到8),并给我们一个新的迭代器,等待在索引9处。next
返回那个单独的字符。
1491625...
),还是它需要自行计算?提取第n位数应该很容易(不管是什么进制 - 但我假设您说的是十进制?)。 - user395760