标题: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();
}
}