做了半天的一道题一看竟然是一道简单题。。
题目描述
地址:外观数组
题目意思很好理解,就是一个递归的过程,从‘1’开始,对每一个输入字符串做一个几个几这样格式的描述,然后再把这个描述作为下一次的输入,直到求出第n项的结果。
解法一
这题是一个比较明显的递归题目,但是由于我递归学的不好,所以就考虑如何不使用递归直接做出来。那么简单说一下我的想法。我的做法就是先写一个将输入字符串进行划分并描述的函数,然后反复调用这个函数就可以了。所以这种方法的重点在于如何写字符串划分并描述的函数。
class Solution:
def countAndSay(self, n: int) -> str:
if n ==1:
return '1'
res = self.countandsay('1')
for i in range(2,n):
t = self.countandsay(res)
res = t
return res
def countandsay(self, s: str) -> str:
res = []
count = 1
pres = s[0]
i, n = 1, len(s)
if n == 1:
res.append('1')
res.append(str(s[0]))
return ''.join(res)
while i < n:
if pres == s[i]:
count = count + 1
i = i+1
else:
res.append(str(count))
res.append(str(pres))
pres = s[i]
count = 0
if count > 0:
res.append(str(count))
res.append(str(s[n-1]))
return "".join(res)
求字符串的描述直接对字符串遍历,比较每一个字符跟前一个字符是否相同并计数,然后在数组中保存每一次遍历到的字符以及出现的次数,最后将数组转化为字符串返回。
递归+双指针
来自评论区的方法,感觉这才是这题要考的东西。
class Solution:
def countAndSay(self, n: int) -> str:
if n == 1:
return '1'
s = self.countAndSay(n - 1)
ans = ''
start, end = 0, 0
while end < len(s):
while end < len(s) and s[start] == s[end]:
end += 1
ans += str(end - start) + s[start]
start = end
return ans
作者:喜欢叶梓🍃的汪
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnpvdm/?discussion=sKH5WT
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
递归还是需要好好学一下😑