题目大意:
解码字母到整数映射
给你一个字符串 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 <= 1000
s[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.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-1309-decrypt-string-from-alphabet-to-integer-mapping-解题思路分析/