【算法题解】LeetCode 38.外观数列

题目

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:

  • 1
  • 11 (因为上一项时1,11表示1个1)
  • 21 (因为上一项为11,21表示2个1)
  • 1211(1个2,1个1所以为1211)
  • 111221(1个1 1个2 2个1,连起来为111221)

给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。

注意:整数序列中的每一项将表示为一个字符串。

题解

要求第n项,是一个遍历的过程,重复进行count and say。所以考虑提出一个方法:对于输入的某个数列,求它的下一项。

代码

class Solution {
    public String countAndSay(int n) {
        String str = "1";
        for(int i = 1; i < n; i++) {
            str = getCountAndSay(str);
        }
        return str;
    }

	/**
    	求str的下一项。
    */
    public String getCountAndSay(String str) {
        StringBuilder sb = new StringBuilder();
        int len = str.length();
        char index = str.charAt(0);
        int count = 1;
        for(int i = 1; i < len; i++) {
            char c = str.charAt(i);
            if(c != index) {
                sb.append(count);
                sb.append(index);
                count = 1;
                index = c;
            } else {
                count++;
            }
        }
        sb.append(count);
        sb.append(index);
        return sb.toString();
    }
}

你可能感兴趣的:(算法)