实现String decode(String s)来处理字符串s,将数字字符之间的子串按其后数字字符组成的次数(不超过int的取值范围)输出,如,”a2bc3d4”的处理结果为”aabcbcbcdddd”。

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public static String decode(String s) {
// 定义ss或sbs存放待重复的字符串
// String ss = "";
StringBuffer sbs = new StringBuffer();
StringBuffer sbr = new StringBuffer();
int repeat = 0;
for (int i = 0; i < s.length(); i++) {
// 读入待重复的字符
if (s.charAt(i) < '0' || '9' < s.charAt(i)) {
// 如果前面一个字符为数字字符,表示重复次数读入完毕
if (i - 1 >= 0 && '0' <= s.charAt(i - 1) && s.charAt(i - 1) <= '9') {
for (int j = 0; j < repeat; j++)
// sbr.append(ss);
sbr.append(sbs);
// 将ss置空或将sbs初始化,repeat清零
// ss = "";
sbs = new StringBuffer();
repeat = 0;
}
// ss += s.charAt(i);
sbs.append(s.charAt(i));
}
// 读入重复次数
if ('0' <= s.charAt(i) && s.charAt(i) <= '9')
repeat = 10 * repeat + (s.charAt(i) - '0');
}
// 以数字字符结尾的字符串无法再读入其他字符
if (sbs.toString() != "")
for (int j = 0; j < repeat; j++)
// sbr.append(ss);
sbr.append(sbs);
return sbr.toString();
}

简单的测试程序:

1
2
3
4
5
6
7
public static void main(String[] args) {
System.out.println(decode("a2bc3d4"));
System.out.println(decode("2a3bc4d"));
System.out.println(decode("a20bc0d5e"));
}

输出结果为:

1
2
3
aabcbcbcdddd
aaabcbcbcbc
aaaaaaaaaaaaaaaaaaaaddddd

需要注意的点:

  • 多任务并发访问时,使用StringBuffer,如果是单任务访问,使用StringBuilder更高效;
  • 应该使用初始化实现sbs内容的清理,而不是直接置空。