1309. 解码字母到整数映射『简单』

题目来源于力扣(LeetCode

一、题目

1309. 解码字母到整数映射

题目相关标签:字符串

说明:

  • 1 <= s.length <= 1000
  • s[i] 只包含数字('0'-'9')和 '#' 字符。
  • s 是映射始终存在的有效字符串。

二、解题思路

  1. 声明 StringBuilder 来记录每一次遍历得到的结果

  2. 倒序遍历字符数组,遇到 # 字符时对前两位数字字符进行 int 值的转换及计算,并将数值对应的字母字符 append 到缓冲字符串中

  3. 遇到单个数字字符时,也进行 int 值的转换,将该数值对应的字母字符 append 到缓冲字符串中

  4. 最后缓冲字符串需要进行反转,得到最终结果

三、代码实现

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);
}
posted @ 2020-05-28 20:35  知音12138  阅读(260)  评论(0编辑  收藏  举报