leetcode38_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, 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"

首先说一下题意:

n=1时输出字符串1;n=2时,数上次字符串中的数值个数,因为上次字符串有1个1,所以输出11;n=3时,由于上次字符是11,有2个1,所以输出21;n=4时,由于上次字符串是21,有1个2和1个1,所以输出1211。

自己写的好像理解错题意了所以删掉了。。

以下是参考的c语言代码示例:

扫描二维码关注公众号,回复: 5302989 查看本文章

char* countAndSay(int n) {
    char *result = NULL;//指针没有指向确定的内存空间
    if (n == 1) {
        result = malloc(2);//用malloc开辟一个2字节的内存空间,用来放result数组
        result[0] = '1';
        result[1] = '\0';
        return result;//在c 语言中遇到return语句就结束,所以不用把后面的过程都放在else里

}

    char *str = countAndSay(n - 1);//递归
    int len = strlen(str);//strlen输出数组长度

    result = malloc(2 * len * (sizeof *result));//函数的用法是malloc(内存大小);新的数组最长为之前数组的两倍长度,所以开辟一个两倍空间;sizeof返回*result所占的内存,是内存的单位值

    int resultPos = 0;//result数组的下标
    char curChar = str[0];//第一个字符
    int curCnt = 1;//计数为1
    for (int i = 1; i < len; i++) {
        if (curChar == str[i]) {
            curCnt++;//如果相同字符则计数+1
            continue;
        } else {
            result[resultPos] = curCnt + '0';//如果不同字符,则'0'+计数,存在result[resultPos]中
            resultPos++;//下标加一
            result[resultPos] = curChar;//把字符存在下一个result[resultPos]中
            resultPos++;//下标再加一
            curChar = str[i]; //这时重新置字符为不同的字符
            curCnt = 1;//计数回到1
        }
    }
    
    if (curCnt != 0) {
        result[resultPos] = curCnt + '0';
        resultPos++;
        result[resultPos] = curChar;
        resultPos++;

    }//最后一次的字符和计数没有经过不同字符出现时候的存储,所以单独存起来一遍

    result[resultPos] = '\0';//字符串末尾为'\0'
    result = realloc(result, resultPos + 1);//realloc函数用法为:(数据类型*)realloc(要改变内存大小的指针名,新的大小
    free(str);//释放str,str是中间过程的数组
    return result;
}

以下是java版本示例:

class Solution {
    public String countAndSay(int n) {
        if (n <= 1) {
            return "1";
        }//初始化
        String prev = countAndSay(n-1);//现在的字符串与之前的字符串是递归的关系,要注意,在递归之前要将初始字符串设置好,然后后面直接用递归结果就可以了,并不复杂,String需要大写
        StringBuilder curr = new StringBuilder();//java中新建不确定长度的字符串用StringBuilder,后面用append添加元素即可
        for (int i = 0; i < prev.length(); ) {
            char c = prev.charAt(i);//string型的字符串用charAt(i)可以获得
            int count = 1;//两层循环结构,第一层遍历前字符串的每一个字符,第二层以j计数,从i开始看后面有几个数跟i相同,遇到不同的会终止第二层循环。也就是2112读作122112,2并不合并。
            while (i+count < prev.length() && prev.charAt(i+count) == c) {
                count++;//以i为基准,向后扫描count位,扫描后跳转到i+count位置
            }
            curr.append(count).append(c);
            i += count;//读了一段数之后,添加元素,把i指向这段后面的内容
        }
        return curr.toString();//用.toString()来返回字符串,不用会报错:StringBuilder cannot be converted to String
    }
}

猜你喜欢

转载自blog.csdn.net/lilililililydia/article/details/81004829