题目

教你怎么数数
1
1 读作:1个1;写作:11
11 读作:2个1;写作:21
21 读作:1个2,1个1;写作:1211
……
问:第n行写作什么?

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.

https://leetcode.com/problems...


算法

  • 思路:暴力枚举,数数

  • 边界条件

    • 最后一个被比较对象没有被记录,因此退出循环后要加进去

  • 不能写作 s+=1+'a';

    • 会先算等式右边的,右边的就变成int类型了,先变成98,再加进s里,结果就惨不忍睹

    • 正确写法是 s=s+1+'a';

尝试

    public String countAndSay(int n) {
        int start = 0;
        String re = "1";
        char[] ch=re.toCharArray();
        
        for (int i = 1; i <= n - 1; i++) {
            start=0;
            ch = re.toCharArray();
            re = "";
            for (int j = 0; j < ch.length; j++) {
                if (ch[j] != ch[start]) { //这样子写很方便,不用在两个字符相等的时候用另外的变量count去计数,如果相同的话j就会移动了,j就是那个计数器。但是虽然没有count,却需要一个起点start,不过只需要记录一次就可以了。
                    re = re + (j - start) + ch[start];
                    start = j;
                }
            }
            re = re + (ch.length - start)  + ch[start]; //最后一个没有被记录
        }
        
        return re;
    }

借鉴

  • StringBuilder 快很多

    public String countAndSay(int n) {
        int start = 0;
        StringBuilder re = new StringBuilder("1");
        char[] ch;

        for (int i = 1; i <= n - 1; i++) {
            start=0;
            ch = re.toString().toCharArray();
            re = new StringBuilder();
            for (int j = 0; j < ch.length; j++) {
                if (ch[j] != ch[start]) {
                    re.append(j-start);
                    re.append(ch[start]);
                    start = j;
                }

            }
            re.append(ch.length-start);
            re.append(ch[start]);
        }

        return re.toString();
    }

lindsay_bubble
26 声望11 粉丝

引用和评论

0 条评论