题目描述:
The count-and-say sequence is the sequence of integers with the first five terms as following:
1
11
21
1211
111221
1 is read off as "one 1" or 11.
11 is read off as "two 1s" or 21.
21 is read off as "one 2, then one 1" or 1211.
Given an integer n where 1 ≤ n ≤ 30, generate the nth term of the count-and-say sequence.
分析:这道题不是很好理解是干嘛的。其实是给定第一个字符串为“1”,然后第二个字符串的值为:读出前一个字符串的结果。原题的意思就是用一个新的字符串描述上一个字符串,用数字表示上一个:
当n=1时:输出1;
当n=2时,解释1,1读作1个 ,表示为11;
当n=3时,解释上一个11,读作2个1,表示为21;(注意相同数字的描述)
当n=4时,解释上一个21,读作1个2,一个1,表示为1211;
当n=5时,解释上一个1211,读作1个1,1个2,2个1,表示为111221;
当n=6时,解释上一个111221,读作3个1,2个2,1个1,表示为312211;
......
如果能理解到这里,那个代码就很简单了,我的Code如下:
public String countAndSay(int n) {
String str = "1";
if (n == 1) {
return str;
}
String[] strs = new String[30];
strs[0] = str;
for (int i = 1; i < n; i++) {
// 1、读取strs[i-1]
strs[i] = readMeth(strs[i - 1]);
}
return strs[n - 1];
}
// 读数的方法
private String readMeth(String s) {
String res = "";
int count = 1;
for (int i = 0; i < s.length(); i++) {
if (i != s.length() - 1) {
if (s.charAt(i) == (s.charAt(i + 1))) {
count++;
} else {
res = res + (count + "") + s.charAt(i);
count = 1;
}
continue;
} else {
res = res + (count + "") + s.charAt(i);
}
}
return res;
}
网友评论