如题 。
题目的要求就是输入一个编码的串S,包含数字和字母,从头开始读取,如果读取到字母,就直接放入结果的解码串,如果读取到数字,就把解码串已有的内容复制几遍。
最后给定一个数K,返回该位置的字符。
想来是比较简单的,因为可以直接申请一个string,读到字母就往里头append,读到数字就复制几遍,然后最后按索引输出结果字符就行了。先试试。
果然有坑!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution {public : string decodeAtIndex (string S, int K) { string contain = "" ; for (int i = 0 ; i < S.length(); i++){ if (S[i] > '1' && S[i] <= '9' ){ for (int j = 1 ; j < S[i] - '0' ; j++){ contain += contain; } } else { contain.append(1 , S[i]); } } stringstream ss; ss << contain[K - 1 ]; string res = ss.str(); return res; } };
1 2 3 4 Input: S = "a2345678999999999999999", K = 1 Output: "a" Explanation: The decoded string is "a" repeated 8301530446056247680 times. The 1st letter is "a".
内存会不够的!!
得另外确定一个思路,可以考虑一下在复制过程中,直接输出K处的结果。
emmm 不需要复制字符串,不然内存占用太大了。。
可以先确定解码后的字符串长度。
然后再反向遍历初始字符串,然后对解码后的字符串长度进行缩短。知道缩短至长度为K时,输出字符。
太妙了!(不是我写的,逃。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 class Solution {public : string decodeAtIndex (string S, int K) { long size = 0 ; int N = S.size(); for (int i = 0 ; i < N; ++i) { if (isdigit (S[i])) size *= S[i] - '0' ; else size++; } for (int i = N-1 ; i >=0 ; --i) { K %= size; if (K == 0 && isalpha (S[i])) return (string ) "" + S[i]; if (isdigit (S[i])) size /= S[i] - '0' ; else size--; } return S; } };
Last updated: 2019-05-16 22:04:13
Thanks for your reading :) | URL
https://joshuaqyh.github.io/2019/03/29/Leetcode-Practice-7/