题目
题解
这道题看了好久才看懂,什么意思呢?
我们来逐层看,每一层都是对上一层的解释
如:
- 第一层就是1
- 第二层是用来解释“一个1”的,那么“一个1”就表示为11
- 第三层解释11,11是“两个1”,表示为21
- 第四层解释21,即“一个2”“一个1”,表示为12 11
- 第五层解释1211,即“一个1”“一个2”“两个1”,表示为11 12 21
- 以此类推…
这道题就是要给出第几层,让你输出这一层对上一层的解释
C++
之前本来是想用vector< string >
来存放每一层的“解释”的,但是后来发现这样不仅麻烦,而且还占用了不必要的空间
要求这一层的“解释”,只需要知道他上一层的就好了,所以,其实只需要两个字符串就行了,不需要字符串数组,代码中string res
存的是上一层的“解释”,string temp
存放本层的“解释”
class Solution {
public:
string countAndSay(int n) {
string res="1";//res初始化:第一层的“解释”
//i来遍历每一层
for(int i=1;i<n;i++)
{
int count=1;
string temp="";
//j来遍历上一层“解释”的每一位
for(int j=0;j<res.size();j++)
{
//count用来计数“相同连续”的数字
if(res[j]==res[j+1])
{
count++;
}
else
{
//count+res[j],即“几个几”,装入“解释”
temp+=to_string(count)+res[j];//count是int型,注意要转成string
count=1;//count置1,为下一次计数做准备
}
}
res=temp;
temp="";
}
return res;
}
};
python
c++和python的区别总是让人猝不及防,最开始写python是照搬的c++代码,结果就会报这个错误
IndexError: string index out of range
Line 9 in countAndSay (Solution.py)
原因是比如你声明了一个长度为10的数组a[10],c++ 中a[10]是’\0’是没问题的,但是 python 不以’\0’为结尾,所以在python中a[10]就会报数组超限,即上面那个错误
我的解决方法是把a[10]单拎出来,代码如下:
class Solution:
def countAndSay(self, n: int) -> str:
res="1"
for i in range(n-1):
count=1
temp=""
for j in range(len(res)):
# 增加临界情况
if j!=len(res)-1 and res[j]==res[j+1]:
count+=1
else:
temp+=str(count)+res[j]
count=1
res=temp
temp=""
return res
以上,两种语言时间复杂度都是O(n2)