[38] Count and Say

来源:互联网 发布:淘宝怎么做直通车引流 编辑:程序博客网 时间:2024/05/16 23:43

1. 题目描述

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.
Given an integer n, generate the nth sequence.

Count and Say的串从1开始,首先将1读为11,之后将11读为21,将21读为1211,将1211读为111221,依次类推,求出第n个串,n=1时,为1。

2. 解题思路

一开始读错题了,以为是随意给一个数,之后将这个数读出来。后来发现不是这样的O.O…题目的意思是,从1开始重复读,先读1,然后读1产生的结果,然后继续往后读下去,返回第n个结果。那么一开始写的Code1也不是没有用,可以在Code1的基础上改进一下。Code1相当于,读1轮产生的数,那么Code2只需要将上一次读的内容作为下一次的输入即可。Code1大体的思路为对于一个数111221,使用一个当前值保存上一个的值,如果不相等,就输出上一个的值和上一个值得个数,且改变当前的值,如果相等就为当前值的计数加1。需要注意的是读到最后一串的时候跟后面的比较会越界,所以最后一串需要单独输出。Code2的思路为将Code1作为中间的一部分,使用一个循环套起来,每一次的结果作为上一次的输入。

3. Code

// Code1:以为参数int是给定的一个随意的数,把这个数的编码计算出来即可。。import java.lang.StringBuffer;public class Solution {    public String countAndSay(int n) {        // 将int转换为String        String giveNum = String.valueOf(n);        // 获取字符串长度        int length = giveNum.length();        int number = 1;  // 保存一轮的个数        StringBuffer sb = new StringBuffer();        for(int i = 0, j = i + 1; j < length; ++j)        {            if(giveNum.charAt(i) != giveNum.charAt(j))            {                // 遇到第一个不重复的字符                sb.append(number).append(giveNum.charAt(i));                i = j;                number = 1;            }else{                number++;            }        }        // 最后一串字符,j越界        sb.append(number).append(giveNum.charAt(length-1));        return sb.toString();    }}
// Code2:import java.lang.StringBuffer;public class Solution {    public String countAndSay(int n) {        if(n <= 0) return "";        String s = "1";        // 做n轮        for(int i = 1; i < n; ++i)        {            StringBuffer sb = new StringBuffer();            // 获取字符串长度            int length = s.length();            int number = 0;  // 保存一轮的个数            char cur = s.charAt(0);            for(int j = 0; j < s.length(); ++j){                if(cur != s.charAt(j))                {                    // 遇到第一个不重复的字符                    sb.append(number).append(cur);                    cur = s.charAt(j);                    number = 1;                }else{                    number++;                }            }            // 最后一串字符,j越界            sb.append(number).append(s.charAt(length-1));            s = sb.toString();        }        return s;    }}
0 0