python - 编程面试的要素-看和说

标签 python algorithm

查看Elements of Programming Interviews并查看以下问题:
在“看”和“说”(或“数”和“说”)序列中找出第n项look and say序列是以下整数的序列:
1,11,21,1211,111221,312211,13112221,1113213211…
作者的解决方案如下:

def look_and_say(n):
  def next_number(s):
    result, i = [], 0 
    while i < len(s):
      count = 1 
      while i + 1 < len(s) and s[i] == s[i + 1]:
        i += 1 
        count += 1
      result.append(str(count) + s[i])
      i += 1 
    return ''.join(result)

  s = '1'
  for _ in range(1, n):
     s = next_number(s)
  return s

我的问题是:递归调用(发生O(2^N)次)同时生成数组和字符串。我知道这只是空间开销中的一个常数因子,但是使用递归函数构建一个列表,然后不是return s,而是返回''.join(s),不是更有效吗?

最佳答案

Python字符串是immutable,这意味着通过一次一个迭代来构造一个长字符串,每次迭代都会使字符串的实例加倍虽然早期的演进可能是垃圾收集,但从概念上讲,这仍然比附加到列表的效率低。
要生成字符串,1113213211将创建所有这些实例:

11
1113
111321
11132132
1113213211

正如作者所做的那样,生成列表将是:
['11', '13', '21', '32', '11']

(顺便说一下,在本例中,look_and_say函数调用其内部函数,next_number。这不是递归。要使其成为递归,其中一个函数必须调用自身。)

关于python - 编程面试的要素-看和说,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50427058/

相关文章:

algorithm - 以编程方式检测两条线的收敛和发散

python - Pandas :将 axvspan 应用于所有子图

python - 多参数解包

python - 无法使用 wxPython 打开在 folium 中生成的本地 HTML 文件

c++ - 自己实现的 std::string::find(暴力搜索)

java - Java中的链表代码

python - 如何更改 Python 3 C 扩展中的函数参数值?

python - Pylint UnicodeDecodeError utf-8 无法解码字节

performance - 字符串连接检查算法的运行时

php - 有没有一种算法可以输出两组元素的所有可能组合?