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 }