题目大意:
解码字母到整数映射
给你一个字符串 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"
示例 3:
输入:s = "25#" 输出:"y"
示例 4:
输入:s = "12345678910#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#" 输出:"abcdefghijklmnopqrstuvwxyz"
提示:
1 <= s.length <= 1000s[i]只包含数字('0'–'9')和'#'字符。s是映射始终存在的有效字符串。
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1309
解题思路分析:
本题难度不大,暴力解的时间复杂度也就是O(n),循环一遍字符串即可。循环时,查看当前位加二的位置是否为井号,如果是,就将当前位与后一位组合起来,查看其对应的字符,并将该字符加入返回结果,同时下标加二继续循环。反之,如果当前位后2位不是井号,那么将当前位数字对应的字符加入返回结果即可。
实现代码:
public String freqAlphabets(String s) {
// 返回结果
StringBuilder sb = new StringBuilder();
// 循环字符串
for(int i=0;i<s.length();i++){
// 当前位数字
int c = s.charAt(i)-'0';
// 如果当前为后2位是井号
if(i+2<s.length()&&s.charAt(i+2)=='#'){
// 将当前位与后一位合并
int n = c*10+(s.charAt(i+1)-'0');
// 将该数字对应的字符加入返回结果
sb.append(Character.toChars(96+n));
i+=2;
}else{
// 当前为后2位不是井号
// 将当前位数字对应的字符加入返回结果
sb.append(Character.toChars(96+c));
}
}
return sb.toString();
}本题解法执行时间为1ms。
Runtime: 1 ms, faster than 75.00% of Java online submissions for Decrypt String from Alphabet to Integer Mapping.
Memory Usage: 34.4 MB, less than 100.00% of Java online submissions for Decrypt String from Alphabet to Integer Mapping.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-1309-decrypt-string-from-alphabet-to-integer-mapping-解题思路分析/