首页 > 试题广场 >

外观数列

[编程题]外观数列
  • 热度指数:7938 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

外观数列的前几项如下:

1, 11, 21, 1211, 111221, ...
1读作“1个1”或11
11读作“2个1“或者21
21读作”1个2,1个1“或者1211
给出一个整数n,请给出序列的第n项
每一次读都是以前一次为基础
注意:序列中的数字用字符串表示


示例1

输入

2

输出

"11"
示例2

输入

4

输出

"1211"
import java.util.*;


public class Solution {
    /**
     * 
     * @param n int整型 
     * @return string字符串
     */
    public String countAndSay (int n) {
        // write code here
        if (n == 1) {
			return "1";
		}
		StringBuilder res = new StringBuilder();
		String str = countAndSay(n - 1);
		int cur = 0;
		char first = str.charAt(0);
		for (int i = 0; i < str.length(); i++) {
			// 如果遍历到最后一个且相等,则前面的数字为 i - cur + 1,如 1 1 2 2 2
			if (i == str.length() - 1 && str.charAt(i) == str.charAt(cur)) {
				res.append(i - cur + 1).append(str.charAt(cur));
				break;
			}
			// 如果遍历到最后一个且不相等,则要拼接 i - cur 个 str[cur],和 1 个 str[end],如 1 1 2 2 3
			else if (i == str.length() - 1 && str.charAt(i) != str.charAt(cur)) {
				res.append(i - cur).append(str.charAt(cur));
				res.append(1).append(str.charAt(i));
				break;
			}
			// 其余不相等情况则直接拼接之前的
			else if (str.charAt(i) != str.charAt(cur)) {
				res.append(i - cur).append(str.charAt(cur));
				cur = i;
			}
		}
		return res.toString();
    }
}

发表于 2020-08-01 12:09:48 回复(0)

public String countAndSay(int n) {
if (n<1)
return "";
int i=1;
StringBuilder last=new StringBuilder();
last.append(1);
while (i<n){
char[] cs =last.toString().toCharArray();
StringBuilder c=new StringBuilder();
int count=1;
for (int j = 0; j <cs.length; j++) {
if(j+1<cs.length&&cs[j]==cs[j+1]){
count++;
}else{
c.append(count);
c.append(cs[j]);
count=1;
}
}
last=c;
i++;
}
return last.toString();
}

发表于 2019-08-15 10:35:52 回复(0)
/*解题思路:每次读取前一次序列结果的时候,通过循环遍历这个序列,设置一个计数标志count, 
初始值置为 1,其代表序列中每个字符出现次数为1,遍历序列,若相邻的两个字符相等,
则执行count++操作;否则将“count(次数)+字符”组成的字符串追加到结果字符串后面。
     注意:使用String会运行超时,因为其存在大量拼接字符串时产生很多中间对象问题,
因此采用StringBuilder或者StringBuffer
*/

 public class Solution {
    public String countAndSay(int n) {
        if(n < 0)
            return "";
        StringBuilder str = new StringBuilder("1");
        for(int i = 1; i < n; i++){
            int count = 1;
            StringBuilder t =  new StringBuilder();
            int len = str.length();
            for(int j = 1; j < len; j++){
                if(str.charAt(j) == str.charAt(j-1)){
                    count ++;
                }
                else{ 
                    t.append(count).append(str.charAt(j-1));
                    count = 1;
                }
            }   
            //读序列的最后一个字符
            t.append(count).append(str.charAt(len - 1));
            str = t;
        }
        return str.toString();
    }
}

发表于 2019-06-25 16:10:52 回复(0)
public class CountAndSay {     public static void main(String[] args) {         CountAndSay say = new CountAndSay();         System.out.println(say.countAndSay(4));              }          public String countAndSay(int n) {
        String res="1";
        for(int i=n-1;i>0;i--){
            res=count(res);
        }
        return res;
    }
    public String count(String res){
        char c=res.charAt(0);
        int num=1;
        StringBuilder sb = new StringBuilder();
        for(int i=1;i<res.length();i++){
            if(res.charAt(i)==c){
                num++;
                continue;
            }
            sb.append(String.valueOf(num)+c);
            c=res.charAt(i);
            num=1;
        }
        sb.append(String.valueOf(num)+c);
        return sb.toString();
    }
}

raodanwohaishixihuanni

发表于 2018-09-22 15:44:10 回复(0)
    public String countAndSay(int n) {
        if(n==1) return "1";
        
        String pre = countAndSay(n-1);
        StringBuilder sb = new StringBuilder();
        
        char ch = pre.charAt(0);
        int cnt = 1;
        
        for(int i=1;i<pre.length();i++){
            char t = pre.charAt(i);
            if(t == ch)
                cnt ++ ;
            else{
                sb.append(cnt).append(ch);
                ch = t;
                cnt = 1;
            }
        }
        
        sb.append(cnt).append(ch);
        
        return sb.toString();
    }

发表于 2018-09-06 15:27:28 回复(0)

题意比较难理解,大致意思就是对上一个序列进行查数:

n=1时,序列为:1;

n=2时,序列为:11;(一个"1")

n=3时,序列为:21;(两个“1”)

n=4时,序列为:1211;(一个“2”,两个“1”)

n=5时,序列为:111221;(一个“1”,一个“2”,两个“1”)

n=6时,序列为:312211;(三个“1”,两个“2”,一个“1”)
使用java的StringBuilder进行字符串的拼接。
实现代码如下:

public class Solution {
    public String countAndSay(int n) {
        String s = "1";
        for (int i = 1; i < n; i++) {
            s = helper(s);
        }
        return s;
    }
    
    public String helper(String s) {
        StringBuilder sb = new StringBuilder();
        
        char c = s.charAt(0);
        
        int count = 1;
        
        for (int i = 1; i < s.length(); i++) {
            if (s.charAt(i) == c) {
                count++;
            } else {
                sb.append(count);
                sb.append(c);
                c = s.charAt(i);
                count = 1;
            }
        }
        
        sb.append(count);
        sb.append(c);
        return sb.toString();
    }
}

发表于 2018-02-03 00:05:50 回复(0)
import java.util.*;
public class Solution {
    public String countAndSay(int n) {
       if(n < 1)
           return "";
        StringBuffer res =new StringBuffer("1");
        StringBuffer tmp;
        int i = 1;
        while(i < n) {
            tmp = getNext(res);
            res = tmp;
            i++;
        }
        return res.toString();
    }
    
    public StringBuffer getNext(StringBuffer sb) {
        char c = sb.charAt(0);
        int num=1;
        StringBuffer res = new StringBuffer();
        for(int i=1; i<sb.length(); i++){
            if(sb.charAt(i)==c){
                num++;
                continue;
            }
            res.append(num);
            res.append(c);
            c=sb.charAt(i);
            num=1;
        }
        res.append(num);
        res.append(c);
        return res;
    }
}

发表于 2017-06-09 21:03:12 回复(1)