880 索引處的解碼字串

2021-09-11 00:18:06 字數 1309 閱讀 8651

給定乙個編碼字串 s。為了找出解碼字串並將其寫入磁帶,從編碼字串中每次讀取乙個字元,並採取以下步驟:

如果所讀的字元是字母,則將該字母寫在磁帶上。

如果所讀的字元是數字(例如 d),則整個當前磁帶總共會被重複寫 d-1 次。

現在,對於給定的編碼字串 s 和索引 k,查詢並返回解碼字串中的第 k 個字母。

示例 1:

輸入:s = 「leet2code3」, k = 10

輸出:「o」

解釋:解碼後的字串為 「leetleetcodeleetleetcodeleetleetcode」。

字串中的第 10 個字母是 「o」。

示例 2:

輸入:s = 「ha22」, k = 5

輸出:「h」

解釋:解碼後的字串為 「hahahaha」。第 5 個字母是 「h」。

示例 3:

輸入:s = 「a2345678999999999999999」, k = 1

輸出:「a」

解釋:解碼後的字串為 「a」 重複 8301530446056247680 次。第 1 個字母是 「a」。

2 <= s.length <= 100

s 只包含小寫字母與數字 2 到 9 。

s 以字母開頭。

1 <= k <= 10^9

解碼後的字串保證少於 2^63 個字母。

我們可以通過逆向工作,跟蹤解碼字串的大小來使用這種洞察力。每當解碼的字串等於某些單詞 word 重複 d 次時,我們就可以將 k 減少到 k % (word.length)。

演算法首先,找出解碼字串的長度。之後,我們將逆向工作,跟蹤 size:解析符號 s[0], s[1], …, s[i] 後解碼字串的長度。

如果我們看到乙個數字 s [i],則表示在解析 s [0],s [1],…,s [i-1] 之後解碼字串的大小將是 size / integer(s[i])。 否則,將是 size - 1。

這是錯誤的思路,把字串展開成完整的,數字太多時,記憶體溢位。

class solution 

else

count++;

} temp = "";

temp += s[k - 1];

return temp;

}};

正確的解法:

class solution 

//倒序遍歷,直到k%size==0

for (int i = n - 1; i >= 0; --i)

return "";

}};

880 索引處的解碼字串

給定乙個編碼字串s。為了找出解碼字串並將其寫入磁帶,從編碼字串中每次讀取乙個字元,並採取以下步驟 現在,對於給定的編碼字串s和索引k,查詢並返回解碼字串中的第k個字母。示例 1 輸入 s leet2code3 k 10輸出 o 解釋 解碼後的字串為 leetleetcodeleetleetcodel...

880 索引處的解碼字串

給定乙個編碼字串s。為了找出解碼字串並將其寫入磁帶,從編碼字串中每次讀取乙個字元,並採取以下步驟 現在,對於給定的編碼字串s和索引k,查詢並返回解碼字串中的第k個字母。示例1 輸入 s leet2code3 k 10 輸出 o 解釋 解碼後的字串為 leetleetcodeleetleetcodel...

880 索引處的解碼字串

給定乙個編碼字串s。為了找出解碼字串並將其寫入磁帶,從編碼字串中每次讀取乙個字元,並採取以下步驟 現在,對於給定的編碼字串s和索引k,查詢並返回解碼字串中的第k個字母。示例 1 輸入 s leet2code3 k 10輸出 o 解釋 解碼後的字串為 leetleetcodeleetleetcodel...