38. Count and Say

The count-and-say sequence is the sequence of integers with the first five terms as following:

1.     1
2.     11
3.     21
4.     1211
5.     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 where 1 ≤ n ≤ 30, generate the nth term of the count-and-say sequence.

Note: Each term of the sequence of integers will be represented as a string.

 

Example 1:

Input: 1
Output: "1"

Example 2:

Input: 4
Output: "1211"

class Solution {
public String countAndSay(int n) {
        StringBuilder sb1 = new StringBuilder("1"), sb2 = sb1;
        while(--n > 0){
            sb2 = new StringBuilder();//初始化外部循环
            int c = 1, i = 0;   //c表示charAt(i)重复的次数
            char[] ch = sb1.toString().toCharArray();
            //开始count的标志
            while(i < sb1.length()){
                if(i+1 < sb1.length() && ch[i] == ch[i+1]) ++c; //重复就++c
                else{//不重复或到达边界就将当前char存入sb2,c回归1
                    sb2.append(c).append(ch[i]);
                    c = 1;
                }
                ++i;
            }
            sb1 = sb2;
        }
        
        return sb1.toString();
    }
}

 

 

来自leetcode,高效简洁

public String countAndSay(int n) {
    String res = "1";
    //从第一行开始,一行一行产生
    while (n > 1) {
        String temp = "";
        for (int i = 0; i < res.length(); i++) {
            int num = getRepeatNum(res.substring(i));
            temp = temp + num + "" + res.charAt(i);
            //跳过重复的字符
            i = i + num - 1;
        }
        n--;
        //更新
        res = temp;
    }
    return res;

}
//得到字符 string[0] 的重复个数,例如 "111221" 返回 3
private int getRepeatNum(String string) {
    int count = 1;
    char same = string.charAt(0);
    for (int i = 1; i < string.length(); i++) {
        if (same == string.charAt(i)) {
            count++;
        } else {
            break;
        }
    }
    return count;
}

 

posted @ 2019-01-29 23:32  Schwifty  阅读(108)  评论(0编辑  收藏  举报