「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:
1
11
21
1211
111221 1 被读作 "one 1" ("一个一") , 即 11。 11 被读作 "two 1s" ("两个一"), 即 21。 21 被读作 "one 2", "one 1" ("一个二" , "一个一") , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。
注意:整数序列中的每一项将表示为一个字符串。
示例 1:
输入: 1 输出: “1” 示例 2:
输入: 4 输出: “1211”
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/count-and-say
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处
读了好多遍题目没有读懂😅
思路是先对一个字符值进行计算知道他下一要出现的字符串,取出一个临时的值,遍历字符串找出和其不相等的值,计算当前保存的值出现的次数,然后重置临时值为当前值,重新计算,直至所有值计算完毕;最后使用递归的方式就可以了
public class CountAndSay {
public String countAndSay(int n){
if (n==1){
return "1";
}
String ans="1";
for (int i = 2;i<=n;i++){
ans=countSameNum(ans);
}
return ans;
}
public String countSameNum(String s){
String ans = "";
List<String> list = new ArrayList<>();
char tem = s.charAt(0);
int start=0;
for (int i=0;i<s.length();i++){
if (s.charAt(i)!=tem){
list.add(s.substring(start,i));
start=i;
tem=s.charAt(i);
}
}
list.add(s.substring(start,s.length()));
for (int j=0;j<list.size();j++){
ans+=list.get(j).length()+list.get(j).substring(0,1);
}
return ans;
}
public static void main(String[] args) {
CountAndSay cas = new CountAndSay();
// System.out.println(cas.countSameNum("1"));
System.out.println(cas.countAndSay(5));
}