打印给定文件夹和子文件夹中的所有文件,而不使用递归/堆栈

时间:2012-10-30 04:35:06

标签: algorithm data-structures language-agnostic

我最近接受了一家信誉良好的公司的采访,担任软件开发人员的职位,这是其中一个问题:

“鉴于以下方法:

List subDirectories(String directoryName){ ... }; 
List filesInDirectory(String directoryName) { ... };

顾名思义,第一种方法返回输入目录('directoryName')中直接子目录的名称列表,第二种方法返回该文件夹中所有文件的名称列表。

打印文件系统中的所有文件。“

我想到了这一点并给了采访一个非常明显的递归解决方案。然后她告诉我没有递归就这样做。由于递归使用了调用堆栈,我告诉她我将使用辅助堆栈,在这一点上她告诉我不要使用堆栈。不幸的是,我无法提出解决方案。我确实问过没有递归/堆栈怎么做,但她不会说。

如何做到这一点?

3 个答案:

答案 0 :(得分:3)

您想要使用队列和BFS算法。

我猜一些伪代码会很好:

files = filesInDirectory("/")
foreach (file in files) {
   fileQ.append(file)
}

dirQ = subDirectories("/")
while (dirQ != empty) {
   dir = dirQ.pop
   files = filesInDirectory(dir)
   foreach (file in files) {
      fileQ.append(file)
   }
   dirQ.append(subDirectories(dir))
}

 while (fileQ != empty) {
   print fileQ.pop
 }

答案 1 :(得分:1)

如果我理解正确,直接子目录只是该文件夹中的目录。我的意思是,如果我=我们有三个路径/home/user/home/config/home/user/u001,我们可以说userconfig都是{{{}的直接子目录1}},但/home/不是。如果u001user是文件(u001是即时的,而user不是),则同样适用。

因此,您不需要递归或堆栈来返回直接子目录或文件的列表。

编辑:我认为OP希望实施u001subDirectories()功能。

所以,你可以做一些事情,比如打印所有文件(伪代码的种类):

filesInDirectories()

答案 2 :(得分:1)

我认为@lqs建议的确是一个她可能一直在寻找的可接受的答案:将完整路径存储在变量中,如果输入子目录,则将目录名附加到它,并剪掉最后一个目录你离开时的名字。这样,您的完整路径就可以作为指向您当前在文件系统中的位置的指针。

因为完整路径总是在最后修改,所以完整路径(不奇怪)就像你的堆栈一样。

除了采访问题之外,我认为我仍然可以通过字符串操作选择真正的堆栈......