給定乙個編碼字串 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...