题目描述
给你一个字符串 s
,它由数字('0'
- '9'
)和 '#'
组成。我们希望按下述规则将 s
映射为一些小写英文字符:
- 字符(
'a'
-'i'
)分别用('1'
-'9'
)表示。 - 字符(
'j'
-'z'
)分别用('10#'
-'26#'
)表示。
返回映射之后形成的新字符串。
题目数据保证映射始终唯一。
示例 1:
输入:s = "10#11#12" 输出:"jkab" 解释:"j" -> "10#" , "k" -> "11#" , "a" -> "1" , "b" -> "2".
示例 2:
输入:s = "1326#" 输出:"acz"
提示:
1 <= s.length <= 1000
s[i]
只包含数字('0'
-'9'
)和'#'
字符。s
是映射始终存在的有效字符串。
题目分析
解法
class Solution {
public String freqAlphabets(String s) {
//反向遍历,遇到#向前遍历两位
char[] chars=s.toCharArray();
StringBuilder res=new StringBuilder();
int i=s.length()-1;
while(i>=0){
if(chars[i]=='#'){
//遇到#,向前移两位计算对应的增量值x-1,基础值为'a',结果'a'+(x-1);
res.append((char)((chars[i-2]-'0')*10+chars[i-1]-'0'+'a'-1));
i=i-3;
}else{
res.append((char)(chars[i]-'0'-1+'a'));
i--;
}
}
return res.reverse().toString();
}
}