Count and Say,统计并输出,利用递归,和斐波那契数列原理一样。

问题描述:n=1,返回“1”;n=2,返回“11”;n=3,返回“21”;n=4,返回1211,。。。。

算法分析:和斐波那契数列道理差不多,都是后一个要依赖前一个元素。因此可以使用递归,也可以使用迭代。

递归算法:

 1 public String countAndSay(int n)
 2     {
 3         StringBuffer sb = new StringBuffer();
 4         if(n <= 0)
 5             return null;
 6         
 7         if(n == 1)
 8         {
 9             return "1";
10         }
11         
12         if(n >= 2)
13         {
14             String s = countAndSay(n-1);
15             int count = 1;
16             for(int i = 1; i < s.length(); i ++)
17             {
18                 if(s.charAt(i) == s.charAt(i-1))
19                 {
20                     count ++;
21                 }
22                 else
23                 {
24                     sb.append(count);
25                     sb.append(s.charAt(i-1));
26                     count = 1;
27                 }
28             }
29             sb.append(count);
30             sb.append(s.charAt(s.length()-1));
31         }
32         return sb.toString();
33     }

迭代算法:

 1 public String countAndSay(int n)
 2     {
 3         
 4         if(n <= 0)
 5         {
 6             return null;
 7         }
 8         String result = "1";
 9         for(int i = 1; i < n; i ++)
10         {
11             StringBuffer sb = new StringBuffer();
12             int count = 1;
13             for(int j = 1; j < result.length(); j ++)
14             {
15                 if(result.charAt(j) == result.charAt(j - 1))
16                 {
17                     count ++;
18                 }
19                 else
20                 {
21                     sb.append(count);
22                     sb.append(result.charAt(j-1));
23                     count = 1;
24                 }
25             }
26             sb.append(count);
27             sb.append(result.charAt(result.length()-1));
28             result = sb.toString();
29         }
30         return result;
31     }

 

posted @ 2016-06-14 15:44  32ddd  阅读(277)  评论(0编辑  收藏  举报