leetcode 38 count and say

題目詳情

The count-and-say sequence is the sequence of integers with the first five terms as following:
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 term of the count-and-say sequence.

這道題目理解起來有一些晦澀。大意就是對於一串字符串,咱們要用「讀」的方式把這個字符串讀一遍,「讀」結果就是下一個字符串的值。
例如初始字符串是「1」,讀的結果就是1個11,因此第二個字符串就是11。而11讀起來是兩個1,因此第三個字符串就應當是「21」。同理第四個字符串是一個2一個1,所以是"1211"。依次類推
而咱們的目的是,對於輸入的正整數n,咱們要給出第n個字符串是什麼。app

Example 1:
Input: 1
Output: "1"
Example 2:
Input: 4
Output: "1211"ui

想法

  • 若是咱們要得到第n個字符串,那咱們首先要得到第n-1個字符串的值。因此咱們設置一個prev變量來保存每一次操做的到的字符串的值,從而進行下一次操做。
  • 操做其實就是從前到後對每個字符(say)連續出現的次數計數(count),若是字符變了,那麼就將剛纔count和say的值加入curr字符串中。
  • 這裏採用了StringBuilder是爲了減小內存的開銷。這裏說一下StringBuilder 和 String 的區別,在使用String時,每次的修改都會使系統在內存中建立一個新的對象,這樣在咱們對string進行頻繁修改的時候,string對象的開銷可能會十分昂貴。‘

解法

public class CountandSay_38 {
    public String countAndSay(int n) {
        //設置初始字符串            
        StringBuilder curr = new StringBuilder("1");
        StringBuilder prev;
        
        for(int i=1;i<n;i++){
            prev = curr;
            //將curr從新賦值
            curr = new StringBuilder();
            //當前字符
            char say = prev.charAt(0);
            //字符計數
            int count = 1;
            
            for(int j=1,len=prev.length();j<len;j++){
                if(prev.charAt(j) != say){                    
                    curr.append(count).append(say);
                    count =1;
                    say = prev.charAt(j);

                }else{
                    count++;
                }
            }
            curr.append(count).append(say);
            
        }
        return curr.toString();
    }
}
相關文章
相關標籤/搜索