1

题目详情

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个字符串是什么。

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

想法

  • 如果我们要获得第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();
    }
}

soleil阿璐
350 声望45 粉丝

stay real ~