zoukankan      html  css  js  c++  java
  • 解码字母

    此博客链接: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;
        
    
        }
    }
    

      

    出来混总是要还的
  • 相关阅读:
    git gui 学习
    Java中关于 ArrayList 和 Map 的常用遍历方法 (学习笔记,便于以后查询)
    关于对 NUMA 理解(学习笔记,便于以后查阅)
    Java判断数据库表是否存在的方法
    流程开发Activiti 与SpringMVC整合实例
    shiro权限管理框架与springmvc整合
    Java开发中的23种设计模式详解(转)
    JMS学习之路(一):整合activeMQ到SpringMVC
    SpringMVC中定时任务配置
    RPC远程过程调用学习之路(一):用最原始代码还原PRC框架
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/14022559.html
Copyright © 2011-2022 走看看