![](/img/trans.png)
[英]Efficient algorithm to find the n-th digit in the string 112123123412345
[英]how to find n'th digit in a number like 1491625…?
讓我們連接以1開頭的數字的平方。那么,這個字符串中的第n個數字是多少?
例如,第10位是4。
1 4 9 16 25 36 49 64 81
這只是一個普通的問題,是我的普通思想。 今晚如何才能解決這個問題呢? 沒有循環的任何算法?
您可以通過取10次冪的平方根來計算此序列中有多少1位,2位,3位等數字。 這將允許您確定第n個數字所在的數字。從那里,它應該是非常微不足道的。
這應該是O(log n)復雜度。
ceil(log 10 (x + 1))將給出一個數字中的位數。 迭代通過正方形保持總長度的計數,一旦達到或超過目標長度n,你就知道你需要m的最后一個數字的第m位數(易於計算)。 通過除以10 m-1獲得該數字的第m位數,而不是使用mod 10獲取最后一位數字。
總而言之,恆定空間開銷和O(n)運行時。
Haskell中的懶惰無限列表使這個無聊的表達天真。
ghci> concat [show $ i*i | i <- [1..]] !! 9 '4'
為了解決這個問題,我使用了Python生成器 。 我的Python解決方案:
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
跑:
>>> get_nth_element(1000)
Number of iterations 229
'2'
>>> get_nth_element(10000)
Number of iterations 1637
'7'
如果你已達到n,你為什么不循環,取每個數字,平方並遞增計數,從每一步檢查1? 您無需跟蹤整數。 這是一個簡單的模擬練習。 我擔心,我無法確定這種模式或公式。
這是一個直接端口的ephemient的Haskell對Scala的回答
Iterator.from(1).flatMap(x=>(x*x).toString.iterator).drop(9).next
返回4
上)
Iterator.from(1)
創建一個無數的迭代器,它計算1,2,3,4,....
(x*x).toString
計算每個的平方並將它們變成字符串。 flatMap( ... .iterator)
將這些連接起來,成為所討論序列中字符的無限迭代器 drop(9)
從迭代器中刪除前9個元素(索引0到8)並給我們一個等待索引9的新迭代器 next
給我們那個單一的角色。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.