leetcode: Count and Say

问题描述:

The count-and-say sequence is the sequence of integers beginning as follows:
1, 11, 21, 1211, 111221, ...

1 is read off as "one 1" or 11.
11 is read off as "two 1s" or 21.
21 is read off as "one 2, then one 1" or 1211.

Given an integer n, generate the nth sequence.

Note: The sequence of integers will be represented as a string.

原问题链接:https://leetcode.com/problems/count-and-say/

问题分析

  因为这里是根据一个数字来递推另外一个串。最开始的情况是只有字符串"1",这也是针对n = 1的情况。在后面,对于任何一个串来说,我们需要在遍历的时候计算当前的那个元素出现的次数。在碰到相同元素的时候对计数加一,否则说明碰到另外的一个数字了,需要将当前的数字和出现的次数放到一个串里,然后再将当前不同的那个值设为当前值。在循环遍历结束后,还要将当前的这个值和出现的次数加入到串里。这样就得到了一个一次转换后的结果。

  对于给定数字n来说它无非就是按照上述的变换执行了n次。所以可以很容易的得到如下的代码:

public class Solution {
    public String countAndSay(int n) {
        String s = "1";
        for(int i = 1; i < n; i++) {
            s = countNumbers(s);
        }
        
        return s;
    }
    
    private String countNumbers(String s) {
        if(s.length() == 1) {
            return 1 + s;
        }
        char cur = s.charAt(0);
        int count = 1;
        StringBuilder builder = new StringBuilder();
        for(int i = 1; i < s.length(); i++) {
            if(s.charAt(i) == cur)
                count++;
            else {
                builder.append(count + "" + cur);
                cur = s.charAt(i);
                count = 1;
            }
        }
        builder.append(count + "" + cur);
        return builder.toString();
    }
}

猜你喜欢

转载自shmilyaw-hotmail-com.iteye.com/blog/2287775