1309. 解码字母到整数映射『简单』
题目来源于力扣(LeetCode)
一、题目
题目相关标签:字符串
说明:
1 <= s.length <= 1000
s[i]
只包含数字('0'
-'9'
)和'#'
字符。s
是映射始终存在的有效字符串。
二、解题思路
-
声明 StringBuilder 来记录每一次遍历得到的结果
-
倒序遍历字符数组,遇到 # 字符时对前两位数字字符进行 int 值的转换及计算,并将数值对应的字母字符 append 到缓冲字符串中
-
遇到单个数字字符时,也进行 int 值的转换,将该数值对应的字母字符 append 到缓冲字符串中
-
最后缓冲字符串需要进行反转,得到最终结果
三、代码实现
3.1 线性扫描法
public static String freqAlphabets(String s) {
StringBuilder sb = new StringBuilder();
char[] arr = s.toCharArray();
int count = 0;
// 从后往前遍历
for (int i = arr.length - 1; i >= 0; i--) {
// 为 # 字符时
if (arr[i] == '#') {
// 得到前两位数字字符的数字形式
count = Integer.parseInt("" + arr[i - 2] + arr[i - 1]);
// 索引减 2
i -= 2;
} else {
// 当前数字字符的数字形式
count = Integer.parseInt("" + arr[i]);
}
// 数字对应的 ascii 字符:10 - j(106),即加 'a' - 1
sb.append((char) (count + 96));
}
return sb.reverse().toString();
}
3.2 线性扫描法——优化版
public static String freqAlphabets(String s) {
StringBuilder sb = new StringBuilder();
char[] arr = s.toCharArray();
int count = 0;
for (int i = arr.length - 1; i >= 0; i--) {
if (arr[i] == '#') {
// 数字字符转数值
count = (arr[i - 2] - '0') * 10 + (arr[i - 1] - '0');
// 索引减 2
i -= 2;
} else {
// 数字字符转数值
count = (arr[i] - '0');
}
// 将数字字符转换成的整数,映射为单个字母字符,添加到缓冲字符串中
sb.append((char) ((count - 1) + 'a'));
}
return sb.reverse().toString();
}
四、执行用时
4.1 线性扫描法
4.2 线性扫描法——优化版
五、部分测试用例
public static void main(String[] args) {
String s = "10#11#12"; // output:"jkab"
// String s = "1326#"; // output:"acz"
// String s = "25#"; // output:"y"
// String s = "12345678910#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#";
// output:"abcdefghijklmnopqrstuvwxyz"
String result = freqAlphabets(s);
System.out.println(result);
}