第一反应
就这样依次往下递推。而且也没有“用前两项推测下一项”之类的,都是用上一行推测下一行。
看看有哪些特性
连续的数字,不管有连续的几个(也不一定,如果超过十个数呢?),都会变成两个数字表示(其实不一定,有可能超过连续十个数)
不对,是不是根本不可能有连续的超过十个数?如果不考虑前面有连续的超过十个数,最多连着3个数字一样,因为描述一项的两个数字的第二个数字是标识这串“连续数字”是什么,所以相邻的连续数字必定是不同的(否则就被视为同一串连续数字)所以,偶数个数字一定标识连续数字是什么,并且相邻的数字不同,并且只能是123,奇数个数字表示连续数字的个数,只能是123。
但是这些性质有什么用呢?是不是还是只能用模拟?
两个2是稳定的,两个2前面不会出现2,两个2之后有可能出现2
这样看来数列的尾数是比较好推测的,因为22可以作为分界线,22前面的内容不会影响22.
221->2211->2221->3211
算了,看来还是会被打破,并没有用
看看题解,有没有比直接模拟更好的方法
考虑到只有123三个数字,直接模拟开销也不大
题解
官方题解方法2带头打表,我是没想到的
评论区:“面向测试用例编程”
贴一个模拟的方法
class Solution {
public String countAndSay(int n) {
String str = "1";
for (int i = 2; i <= n; ++i) {
StringBuilder sb = new StringBuilder();
int start = 0;
int pos = 0;
while (pos < str.length()) {
while (pos < str.length() && str.charAt(pos) == str.charAt(start)) {
pos++;
}
sb.append(Integer.toString(pos - start)).append(str.charAt(start));
start = pos;
}
str = sb.toString();
}
return str;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/count-and-say/solution/wai-guan-shu-lie-by-leetcode-solution-9rt8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。