解码字母到整数映射
难度:
标签:
题目描述
代码结果
运行时间: 25 ms, 内存: 16.1 MB
/*
题目思路:
使用Java Stream API来处理字符串转换。将字符串拆分成字符数组,使用Stream进行处理,遇到'#'字符时进行特殊处理。最终收集处理后的字符并合并成新的字符串。
*/
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class Solution {
public String freqAlphabets(String s) {
StringBuilder sb = new StringBuilder(s);
return IntStream.range(0, s.length())
.filter(i -> sb.charAt(i) != '#')
.mapToObj(i -> {
if (i + 2 < sb.length() && sb.charAt(i + 2) == '#') {
String numStr = sb.substring(i, i + 2);
sb.setCharAt(i, '#');
sb.setCharAt(i + 1, '#');
return (char) ('j' + Integer.parseInt(numStr) - 10);
} else if (sb.charAt(i) != '#') {
return (char) ('a' + sb.charAt(i) - '1');
}
return null;
})
.filter(c -> c != null)
.map(String::valueOf)
.collect(Collectors.joining());
}
}
解释
方法:
这个问题可以通过遍历字符串来解决。遍历时,首先检查当前位置后两个字符是否为'#'。如果是,说明当前数字是两位数(10到26之间),需要将其转换为相应的字母('j'到'z')。否则,当前数字是一位数(1到9之间),直接转换为相应的字母('a'到'i')。转换方法是将数字字符转为整数,然后通过加上ASCII码的'a'的值减一来获取对应的字母。遍历完成后,得到的结果字符串即为答案。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在解码过程中,如果字符串以'0'开头,如'01#'或'012',该如何处理?
▷🦆
在解码过程中,遇到连续的'#'字符(例如'##'或'#10#'),算法如何确保不出错?
▷🦆
对于字符串末尾的数字,如果不足三位且不含'#',例如输入'12345',算法是如何确保正确解码最后的'45'?
▷🦆
算法中使用的int(s[i:i+2])转换当遇到不是数字的字符时会如何处理?例如输入包含非法字符。
▷