Java给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。

标题:Java给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。

一、题目:【注:append().append()的速度快于+ 可以直观的感受到】
给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。

注意:整数序列中的每一项将表示为一个字符串。
在这里插入图片描述在这里插入图片描述二、题解

  • 使用递归和String 20ms
/**
	 * 使用递归和String 20ms
	 * @param n
	 * @return
	 */
	public String countAndSay(int n) {
        if(1==n){
            return "1";
        }else if(2==n){
            return "11";
        }else {
            String s=countAndSay(n-1);
            int i=0;
            int count=1;
            String str="";
            for(int j=1;j<s.length();j++){
                if(s.charAt(i)==s.charAt(j)){
                    count++;
                }else{
                    str=str+count+s.charAt(i);
                    count=1;
                    i=j;
                }
            }
            str=str+count+s.charAt(i);
            return str;
        }
    }
  • 使用递归和StringBuffer 11ms append(…+…+…) 11ms
/**
	 * 使用递归和StringBuffer   11ms  append(..+..+..)  11ms
	 * @param n
	 * @return
	 */
	public String countAndSay02(int n) {
        if(1==n){
            return "1";
        }else if(2==n){
            return "11";
        }else {
            String s=countAndSay(n-1);
            int i=0;
            int count=1;
            StringBuffer str=new StringBuffer();
            for(int j=1;j<s.length();j++){
                if(s.charAt(i)==s.charAt(j)){
                    count++;
                }else{
                    str.append(""+count+s.charAt(i));
                    count=1;
                    i=j;
                }
            }
            str.append(""+count+s.charAt(i));
            return str.toString();
        }
    }

*使用递归和StringBuffer .append(…).append() 2ms

/**
	 * 使用递归和StringBuffer  .append(...).append()   2ms 
	 * @param n
	 * @return
	 */
	public String countAndSay022(int n) {
        if(1==n){
            return "1";
        }else if(2==n){
            return "11";
        }else {
            String s=countAndSay(n-1);
            int i=0;
            int count=1;
            StringBuffer str=new StringBuffer();
            for(int j=1;j<s.length();j++){
                if(s.charAt(i)==s.charAt(j)){
                    count++;
                }else{
                    str.append("").append(count).append(s.charAt(i));
                    count=1;
                    i=j;
                }
            }
            str.append("").append(count).append(s.charAt(i));
            return str.toString();
        }
    }

完整代码如下:

public class TestGiveNumToStr {
	/**
	 * 使用递归和String 20ms
	 * @param n
	 * @return
	 */
	public String countAndSay(int n) {
        if(1==n){
            return "1";
        }else if(2==n){
            return "11";
        }else {
            String s=countAndSay(n-1);
            int i=0;
            int count=1;
            String str="";
            for(int j=1;j<s.length();j++){
                if(s.charAt(i)==s.charAt(j)){
                    count++;
                }else{
                    str=str+count+s.charAt(i);
                    count=1;
                    i=j;
                }
            }
            str=str+count+s.charAt(i);
            return str;
        }
    }
	@Test
	public void test() {
		String str = this.countAndSay(5);
		System.out.println(str);
	}
	/**
	 * 使用递归和StringBuffer   11ms  append(..+..+..)  11ms
	 * @param n
	 * @return
	 */
	public String countAndSay02(int n) {
        if(1==n){
            return "1";
        }else if(2==n){
            return "11";
        }else {
            String s=countAndSay(n-1);
            int i=0;
            int count=1;
            StringBuffer str=new StringBuffer();
            for(int j=1;j<s.length();j++){
                if(s.charAt(i)==s.charAt(j)){
                    count++;
                }else{
                    str.append(""+count+s.charAt(i));
                    count=1;
                    i=j;
                }
            }
            str.append(""+count+s.charAt(i));
            return str.toString();
        }
    }
	@Test
	public void test02() {
		String str = this.countAndSay02(5);
		System.out.println(str);
	}
	
	/**
	 * 使用递归和StringBuffer  .append(...).append()   2ms 
	 * @param n
	 * @return
	 */
	public String countAndSay022(int n) {
        if(1==n){
            return "1";
        }else if(2==n){
            return "11";
        }else {
            String s=countAndSay(n-1);
            int i=0;
            int count=1;
            StringBuffer str=new StringBuffer();
            for(int j=1;j<s.length();j++){
                if(s.charAt(i)==s.charAt(j)){
                    count++;
                }else{
                    str.append("").append(count).append(s.charAt(i));
                    count=1;
                    i=j;
                }
            }
            str.append("").append(count).append(s.charAt(i));
            return str.toString();
        }
    }
	@Test
	public void test022() {
		String str = this.countAndSay022(5);
		System.out.println(str);
	}
	
	//别人的
	public String countAndSay666(int n) {
        if (n == 1) {
            return "1";
        }
        StringBuffer res = new StringBuffer();
        String str = countAndSay(n - 1);
        int length = str.length();
        int a = 0;
        for (int i = 1; i < length + 1; i++) {
            if (i == length) {
                return res.append(i - a).append(str.charAt(a)).toString();
            } else if (str.charAt(i) != str.charAt(a) ) {
                res.append(i - a).append(str.charAt(a));
                a = i;
            }
        }
        return res.toString();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值