簡體   English   中英

使用動態規划查找所有 integer ZE83AED3DDF4667DEC0DAAAACB2BB3BE0BZ 的總和

[英]Finding sum of all integer substring using dynamic programming

我正在解決來自hackerrank 的Sam 和子字符串問題 它基本上是找到具有所有整數的字符串的所有子字符串的總和。

薩曼莎和山姆正在玩數字游戲。 給定一個數字作為字符串,沒有前導零,確定字符串子字符串的所有 integer 值的總和。

給定一個 integer 作為字符串,將其所有子字符串轉換為整數。 隨着數字可能變大,返回模 10⁹ + 7 的值。

示例: n = '42'

這里n是一個字符串,它包含三個 integer 子字符串:4、2 和 42。它們的和是 48,並且 48 模 10⁹ + 7 = 48。

Function 說明

在下面的編輯器中完成子字符串 function。 substrings 具有以下參數: string n:integer 的字符串表示形式

int: n中所有子串的 integer 值之和,取模 (10⁹ + 7)

我嘗試使用記憶化遵循遞歸自上而下的動態問題解決方案:

from functools import cache

def substrings(n):
    @cache
    def substrSum(curIndex):
        if curIndex == 0: return int(n[0])
        return substrSum(curIndex-1)*10 + int(n[curIndex]) * (curIndex+1)
        
    totalSum = 0
    for i in range(len(n)-1, -1,-1): 
        totalSum += substrSum(i) 
        
    return totalSum % (10 ** 9 + 7) 

我還嘗試了帶有記憶的遞歸自下而上動態編程解決方案(這僅for更改循環計數方向):

from functools import cache

def substrings(n):
    @cache
    def substrSum(curIndex):
        if curIndex == 0: return int(n[0])
        return substrSum(curIndex-1)*10 + int(n[curIndex]) * (curIndex+1)
        
    totalSum = 0
    for i in range(len(n)): 
        totalSum += substrSum(i) 
        
    return totalSum % (10 ** 9 + 7) 

對於自上而下的解決方案在 13 個測試用例中有 8 個給出運行時錯誤,而自下而上的解決方案在 13 個測試用例中的 6 個中給出運行時錯誤。 我在哪里犯錯?

您的算法是正確的(兩個版本),但是 HackerRank 將使用具有數千位數字的字符串進行測試,並且當您對每個數字執行遞歸調用時,您的第一個代碼會遇到最大遞歸深度超出錯誤,而第二個代碼會運行進入 memory 錯誤(想想緩存)。

應該注意的是,他們對約束的措辭是錯誤的。 受 2 x 10 5限制的不是n “轉換為整數”的值,而是n中的位數 我檢查了這一點,他們的一項測試涉及大約 199000 位數字的字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM