美文网首页
Leetcode38-统计数字简单的递归解法-CountAndS

Leetcode38-统计数字简单的递归解法-CountAndS

作者: 西5d | 来源:发表于2018-03-21 14:51 被阅读35次

    原题叫countAndSay,描述不太好理解。大致意思是点查每前一个串里的1,2,3的数量,最开始1号序列是1,然后2号就是1个1,即“11”,如下描述:

    有对应序列,输入序号求相应的串:
    当n = 1,串为1,;
    当n = 2,串为1个1(n=1时),即“11”
    当n = 3,串为2个1(n=2时),即“21”
    当n = 4,串为1个2加1个1,即“1211”
    以此类推,求第n个的对应串,countAndSay(int n);
    

    题目属于简单类,除了题目描述,思路比较好理解,主要有些边界条件需要考虑到,基于第n个的对应串依靠前一个n-1的结果,有使用递归,但性能影响不是很大。思路是采用一个map存三种字符(1,2,3)的出现次数,先递归求n-1的序列,得到s,遍历s,统计对应字符出现的次数,如果连续,进入while,次数累加,否则跳到s序列下一个字符,另外每次完成循环清空统计map,完成一次统计后按照[次数,字符]的格式追加到结果序列的StringBuilder里。

     public static void main(String[] args) {
            System.out.println(countAndSay(16));
        }
    
        public static String countAndSay(int n) {
            if (n <= 1) {
                return "1";
            }
    
            Map<Character, Integer> s123 = new HashMap<>();
            String s = countAndSay(n - 1);
            StringBuilder newS = new StringBuilder();
    
            for (int i = 0; i < s.length(); ) {
                s123.clear();
    
                Character c = s.charAt(i);
                s123.put(c, 1);
                i++;
                while (i < s.length()) {
                    if (s.charAt(i) == c) {
                        s123.put(c, s123.get(c) + 1);
                        i++;
                    } else {
                        break;
                    }
                }
                if (s123.get(c) != null) {
                    newS.append(s123.get(c)).append(c);
                }
            }
    
            return newS.toString();
        }
    

    相关文章

      网友评论

          本文标题:Leetcode38-统计数字简单的递归解法-CountAndS

          本文链接:https://www.haomeiwen.com/subject/xwdgqftx.html