题目的要求就是输入一个编码的串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();

// Find size = length of decoded string
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;
}
};