解码字母

此博客链接:https://www.cnblogs.com/ping2yingshi/p/14022559.html

解密字母

题目链接:https://leetcode-cn.com/problems/decrypt-string-from-alphabet-to-integer-mapping/

题目

给你一个字符串 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 是映射始终存在的有效字符串。

题解

思路:按照某种方法把字符串拆分,拆分成两部分,然后按照字母表映射。

方法:

           1.先把映射表做好。

           2.按照#分隔字符串,在每个#前面必然有两个数字是和#在一起的。

           3.判断#个数和分隔后的字符串个数是否一样。

             如果一样则说明是以#结束,那么#前的两位是个#在一起的,其他的都是单独的数字。

             如果不一样,分隔出来的字符串个数最多比#多一个,说明最后一个字符串每个数组都是单独的。

代码

class Solution {
    public String freqAlphabets(String s) {
       char exp []= {'0','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
       int len=s.toCharArray().length;
       int count=0;
       for(int i=0;i<len;i++)
       {
          if(s.charAt(i)=='#')
          {
              count++;
          }
       }
       String temp[]=s.split("#");
       String str="";
       
           //#和字符数组相等,说明以#结束,那么每个数组的最后两位都是和#仪器的
            if(count==temp.length)
            {
                for(int i=0;i<temp.length;i++)
                {
                   String tem="";
                   //如果#前面只有两位,说明就是和#一家的
                   if(temp[i].length()==2)
                  {
                    tem+=temp[i];
                    tem+=temp[i+1];
                    str+=exp[Integer.parseInt(tem)];
                    continue;
                   } 
               //如果#前面不止两位,那就先找到#前两位,然后看还剩几位,并且剩的都是单个数字对应单个字符
                  else{
                    for(int j=0;j<temp[i].length()-2;j++)
                      {
                        str+=exp[temp[i].charAt(j)];
                      }
                     tem+=temp[i].charAt(temp[i].length()-1);
                     tem+=temp[i].charAt(temp[i].length()-2);
                     str+=exp[Integer.parseInt(tem)];
                     
               }
               
              
            }
        }
            //#个数和数组个数不一样,说明最后一个数组时单个数字对应的单个字
            else{
              for(int i=0;i<temp.length-1;i++)
              {
                String tem="";
               //如果#前面只有两位,说明就是和#一家的
               if(temp[i].length()==2)
               {
                    tem+=temp[i];
                    tem+=temp[i+1];
                    str+=exp[Integer.parseInt(tem)];
                    continue;
               } 
               else{
                    for(int j=0;j<temp[i].length()-2;j++)
                      {
                        str+=exp[temp[i].charAt(j)];
                      }
                     tem+=temp[i].charAt(temp[i].length()-1);
                     tem+=temp[i].charAt(temp[i].length()-2);
                     str+=exp[Integer.parseInt(tem)];
                     
               }
              }
              //最后也给数组
            for(int j=0;j<temp[temp.length-1].length();j++)
            {  
               str+=String.valueOf(exp[Integer.parseInt(temp[temp.length-1].charAt(j))]);
            }

            
       }
       return str;
      

    }
}

 此处还有一个问题没有解决,我需要补下基础,改代码时间比写代码时间还长。

数组和字符串长度带不带()问题,类型转换问题,字符串转字符数组,字符转字符串。

还有一个问题报错信息如果,是说字符类型不能变成字符串,但是我把字符转成字符串了啊,还是不行。

 正确代码

class Solution {
    public String freqAlphabets(String s) {
       char exp []= {'0','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
       int len=s.toCharArray().length;
       int count=0;
       for(int i=0;i<len;i++)
       {
          if(s.charAt(i)=='#')
          {
              count++;
          }
       }
       String temp[]=s.split("#");
       String str="";
       
           //#和字符数组相等,说明以#结束,那么每个数组的最后两位都是和#一起的
            if(count==temp.length)
            {
                for(int i=0;i<temp.length;i++)
                {
                   String tem="";
                   //如果#前面只有两位,说明就是和#一家的
                   if(temp[i].length()==2)
                  {
                    tem+=temp[i];
                    str+=String.valueOf(exp[Integer.parseInt(String.valueOf(tem))]);
                    continue;
                   } 
               //如果#前面不止两位,那就先找到#前两位,然后看还剩几位,并且剩的都是单个数字对应单个字符
                  else{
                      //#前两位以前的单字母
                    for(int j=0;j<temp[i].length()-2;j++)
                      {
                        str+=String.valueOf(exp[Integer.parseInt(String.valueOf(temp[i].charAt(j)))]);
                      }
                      //#前面的两位
                     tem+=temp[i].charAt(temp[i].length()-2);
                     tem+=temp[i].charAt(temp[i].length()-1);
                     str+=String.valueOf(exp[Integer.parseInt(String.valueOf(tem))]);
                     
               }
               
            }
        }
            //#个数和数组个数不一样,说明最后一个数组是单个数字对应的单个字
            else{
              for(int i=0;i<temp.length-1;i++)
              {
                String tem="";
               //如果#前面只有两位,说明就是和#一家的
               if(temp[i].length()==2)
               {
                    tem+=temp[i];
                    // str+=exp[Integer.parseInt(tem)];
                     str+=String.valueOf(exp[Integer.parseInt(String.valueOf(tem))]);
                    continue;
               } 
               else{
                    for(int j=0;j<temp[i].length()-2;j++)
                      {
                        // str+=exp[temp[i].charAt(j)];
                         str+=String.valueOf(exp[Integer.parseInt(String.valueOf(temp[i].charAt(j)))]);
                      }
                     tem+=temp[i].charAt(temp[i].length()-2);
                     tem+=temp[i].charAt(temp[i].length()-1);
                    //  str+=exp[Integer.parseInt(tem)];
                    //  str+=StringvlaueOf(exp[Integer.parseInt(StringvalueOf(tem)))]);
                      str+=String.valueOf(exp[Integer.parseInt(String.valueOf(tem))]);
                     
               }
              }
              //最后也给数组
            for(int j=0;j<temp[temp.length-1].length();j++)
            {  
               str+=String.valueOf(exp[Integer.parseInt(String.valueOf(temp[temp.length-1].charAt(j)))]);
            }          
       }
       return str;
      

    }
}

 哈希表解答

思路

先把数字和字母对应关系创建一张哈希表,然后逆序遍历字符串,遇到#就遍历前两个字符,作为key值,去哈希表中找相应的value,添加到结果字符串中。

方法

1.创建哈希表。

2.判断字符串中的值是否为#,如果是#,则去#前面两个字符作为key的值,去哈希表中查找相应的value。

3.把字符串对应的value值串在一起,然后返回。

有问题代码

但是以下代码示例显示不正确,我没有看出来哪里错了。

class Solution {
    public String freqAlphabets(String s) {
        Map<String,String> map=new HashMap();
        // 创建哈希表
        for(int i=1;i<27;i++)
        {
           map.put(String.valueOf(i),String.valueOf((char)(i+96)));
        }
        String result="";
        int i=s.length()-1;
         while(i>0)
       {
          if(s.charAt(i)=='#')
          {
            String  str=String.valueOf(s.charAt(i-2));
            str+=String.valueOf(s.charAt(i-1));
            result+=map.get(str);
            i=i-3;
          }
          else{
              result+=map.get(String.valueOf(s.charAt(i)));
              i=i-1;
          }
       }
       String resulted="";
       for(int k=result.length()-1;k>0;k--)
       {
           resulted+=String.valueOf(result.charAt(k));
       }
    return resulted;
    

    }
}

 

 

 我知道了,是因为我忘记数组下标还有0的情况。

哈希正确代码

class Solution {
    public String freqAlphabets(String s) {
        Map<String,String> map=new HashMap();
        // 创建哈希表
        for(int i=1;i<27;i++)
        {
           map.put(String.valueOf(i),String.valueOf((char)(i+96)));
        }
        String result="";
        int i=s.length()-1;
         while(i>=0)
       {
          if(s.charAt(i)=='#')
          {
            String  str=String.valueOf(s.charAt(i-2));
            str+=String.valueOf(s.charAt(i-1));
            result+=map.get(str);
            i=i-3;
          }
          else{
              result+=map.get(String.valueOf(s.charAt(i)));
              i=i-1;
          }
       }
       String resulted="";
       for(int k=result.length()-1;k>=0;k--)
       {
           resulted+=String.valueOf(result.charAt(k));
       }
    return resulted;
    

    }
}

  

 

posted @ 2020-11-23 01:42  萍2樱释  阅读(393)  评论(6编辑  收藏  举报