leetcode880 索引處的解碼字串

2021-09-17 18:55:35 字數 2185 閱讀 5088

題目:

思路:看到 資料範圍 "解碼後的字串保證少於2^63個字母",單純地拼接字串不實際,即使不考慮時間問題,就連記憶體也會爆掉,所以應該是找規律,找規律最基本的就是找迴圈節(比如說abc3d4,其中有"a","ab" , "abc","abc abc abc","abc abc abcd","abcabcabcd....abcabcabcd" 六個迴圈節,後乙個迴圈節是由前乙個迴圈節得到的)。

迴圈節跟我們要求的第k位的字元有什麼關係?因為,最終得到的字串的每乙個字元  就是 某個迴圈節中的乙個字元(因為最終的字串都是由 迴圈節不斷迴圈迴圈得到的.),自然第k個字元,也是某個迴圈節的乙個字元,我們要確定第k個字元最先出現在哪個迴圈節,我們就能得出這個字元是什麼,分兩步就可以求出結果

第一步:求出每個迴圈節長度放到陣列arr,和 每個迴圈節對應的最後乙個字元放到陣列recordchar

定義乙個 int arr , arr[i] 表示前i個字元的迴圈節長度。recordchar記錄該迴圈節的最後乙個字元。

那麼 "abc3d4" 的arr陣列就是 arr = [1,2,3,9,10,40], recordchar = ['a','b','c','c','d','d'];

i=0 "a" 迴圈1次,所以迴圈節長度arr[0]=1,recordchar[0]='a'; i=1  "ab"迴圈一次,迴圈節長度arr[1]=2,recordchar[1]='b';

i=2 "abc" 迴圈1次,迴圈節長度arr[2]=3,recordchar[2]=『c』; i=3  "abc" 迴圈3次, 迴圈節長度 arr[3] = arr[2]*3 =9,recordchar[3]=recordchar[2]='c';

i=4 "abc3"迴圈3次加上"d",迴圈節長度arr[4] = arr[3]+1 = 10,recordchar[4]='d';

i=5 "abc3d"迴圈4次,迴圈節長度arr[5] = arr[4]*4 = 40,recordchar[5]='d';

第二步:根據k的值,確定k位置的這個字元最先出現在哪個迴圈節中,這個迴圈節最後乙個字元就是我們要求的字元。

很明顯,字元 ch 最先出現在哪個迴圈節,那麼這個迴圈節的最後乙個字元一定是 ch ,仔細想想。

前面的例子s = "abc3d4",我們已經得出:arr=[1,2,3,9,10,40],recordchar = ['a','b','c','c','d','d'];

比如說 'a' 這個字元就是最開始出現在arr[0]這個迴圈節 , 所以recordchar[0] = 'a';字元'd'最開始出現在arr[4]這個迴圈節中,所以recordchar[4] = 'd'。

現在我要求s = "abc3d4"  k=13的字元:

從後往前(40->10->....->1)遍歷陣列arr=[1,2,3,9,10,40],recordchar = ['a','b','c','c','d','d']; 

從arr[5]開始遍歷,長度比k大的迴圈節全部跳過(因為我們要知道k最先出現在哪個迴圈節!k=13 的字元一定存在於arr[5]=40這個迴圈節中,而arr[5]是由 arr[4]得到的,那麼我們可以進一步縮小範圍,走到arr[4] .....,直到我們找到arr[i]<=k的情況),

接下來找到arr[4]=10 (此時k>=arr[4]),

求餘:k=k%arr[4]=3,k!=0 ,說明不是這個迴圈節最後乙個字元record[4]='d',應該是更前面的迴圈節,所以可以縮小範圍"abc3"(本來是"abc3d",現在縮小範圍"abc3"),繼續尋找;

此時問題轉化為:我們要求 s="abc3" k=3的字元,同樣地,

我們只需要 繼續往前遍歷,找到 arr[2]=3 (k>=arr[2]) , k=k%arr[2] = 0,說明最先出現在arr[2]這個迴圈節,字元就是recordchar[2] , 所以 位置 k=13 對應的字元  就是 recordchar[2] = 'c'; 答案就是'c' 。

class solution else

}i = i - 1;

string rs = "";

while(i>=0)

}i--;

}return rs;}}

我想盡力講清楚,可能導致有些部分冗餘了,如果看不懂,可以查閱其他題解,謝謝。

Leetcode 880 索引處的解碼字串

給定乙個編碼字串 s。為了找出解碼字串並將其寫入磁帶,從編碼字串中每次讀取乙個字元,並採取以下步驟 如果所讀的字元是字母,則將該字母寫在磁帶上。如果所讀的字元是數字 例如 d 則整個當前磁帶總共會被重複寫 d 1 次。現在,對於給定的編碼字串 s 和索引 k,查詢並返回解碼字串中的第 k 個字母。示...

880 索引處的解碼字串

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

880 索引處的解碼字串

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