38. Count and Say

这道题和String Compression同理,但是做了好久;原因是字符串尾部(最后一个字符)的处理。

        if(n == 1){return "1";}
// 循环次数 - 可以通过举例子解决。
...
        for ( int i = 2; i < n ; i++) {
            StringBuilder buff = new StringBuilder();
            int loc = 0; 
            int j = loc + 1;
            while(loc < curr.length()) {    
                int count = 1; 
                while (j

首先要理解题干中的例子:
注意到:原先字符串中,
连续重复“X”个数字“Y” - 打印“XY”,意思连着有X个Y;

loc用来记录当前字符串中,parse到的字符位置;
count:当前字符位置 的 字符,重复的次数;

对于某i次循环:
parse完成一个loc字符( curr.charAt(loc) )的统计后,buff.append(“XY”) - X个Y;
然后,跳过已经parse过的 连续 字符,parse下一个。

        for ( int i = 2; i < n ; i++) {
            while(loc < curr.length()) {    
                while (j

另外,打印结果System.out.println()会明显增加运行时间.

  1. 1
    
  2. 11
    
  3. 21
    
  4. 1211
    
  5. 111221 
    
  6. 312211
    
  7. 13112221
    
  8. 1113213211
    
  9. 31131211131221
    
  10. 13211311123113112211

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.

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

StringBuffer

String 对象是不可改变的。每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间。
当在一个循环中将许多字符串连接在一起时,使用 StringBuilder 类可以提升性能。

方法名 使用
StringBuilder.Append 将信息追加到当前 StringBuilder 的结尾。
StringBuilder.AppendFormat 用带格式文本替换字符串中传递的格式说明符。
StringBuilder.Insert 将字符串或对象插入到当前 StringBuilder 对象的指定索引处。
StringBuilder.Remove 从当前 StringBuilder 对象中移除指定数量的字符。
StringBuilder.Replace 替换指定索引处的指定字符。

Append
Append 方法可用来将文本或对象的字符串表示形式添加到由当前 StringBuilder 对象表示的字符串的结尾处。以下示例将一个 StringBuilder 对象初始化为“Hello World”,然后将一些文本追加到该对象的结尾处。将根据需要自动分配空间。
StringBuilder MyStringBuilder = new StringBuilder("Hello World!");
MyStringBuilder.Append(" What a beautiful day.");
System.out.print(MyStringBuilder);

此示例将 Hello World! What a beautiful day. 显示到控制台。

java中单引号和双引号
单引号:引的数据 是char类型的
双引号:引的数据 是String类型的

ppend方法是重写方法,里面既可以放char类型的又可以放String类型的数据,还有其他类型的等等
public String countAndSay(int n) {
        if(n == 1) return "1";
        String pre = countAndSay(n - 1);
        StringBuilder res = new StringBuilder();
        int count = 1;
        for(int i = 1; i <= pre.length(); i ++){
            if(i == pre.length() || pre.charAt(i) != pre.charAt(i - 1)){
                res.append("" + count).append(pre.charAt(i - 1));
                count = 1;
            }else{
                count ++;
            }
        }
        return res.toString();
    }

你可能感兴趣的:(38. Count and Say)