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