美文网首页
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