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

Algorithm 打印给定文件夹和子文件夹中的所有文件,而不使用递归/堆栈,algorithm,data-structures,language-agnostic,Algorithm,Data Structures,Language Agnostic,我最近与一家知名公司就软件开发人员的职位进行了面试,这是我提出的问题之一: “鉴于以下方法: List subDirectories(String directoryName){ ... }; List filesInDirectory(String directoryName) { ... }; 正如名称所示,第一个方法返回输入目录中直接子目录的名称列表(“directoryName”),第二个方法返回此文件夹中所有文件的名称列表 打印文件系统中的所有文件。“ 我考虑了一下,给了采访一个非

我最近与一家知名公司就软件开发人员的职位进行了面试,这是我提出的问题之一:

“鉴于以下方法:

List subDirectories(String directoryName){ ... }; 
List filesInDirectory(String directoryName) { ... };
正如名称所示,第一个方法返回输入目录中直接子目录的名称列表(“directoryName”),第二个方法返回此文件夹中所有文件的名称列表

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

我考虑了一下,给了采访一个非常明显的递归解决方案。然后她告诉我不要递归。由于递归使用调用堆栈,我告诉她我将使用辅助堆栈,在这一点上,她告诉我也不要使用堆栈。不幸的是,我没能想出一个解决办法。我确实问过如何在没有递归/堆栈的情况下实现它,但她没有回答


如何做到这一点?

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

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

编辑:我认为OP想要实现
子目录()
文件独立目录()
函数

因此,您可以执行一些操作,例如打印所有文件(类似于伪代码):


您希望使用队列和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
 }

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

由于完整路径始终在末尾修改,因此完整路径的行为(毫不奇怪)与堆栈相同


撇开面试问题不谈,我想我还是会选择一个真正的堆栈而不是字符串操作,不过…

是否允许在变量上存储完整的路径名?我不确定。。我没有问面试官这个!是的,但是问题要求我打印文件系统中的所有文件,而不仅仅是特定目录中的文件。这是否意味着我需要跟踪我当前所在的目录以及以前的目录,以便我可以回溯?因此,您可以使用BFS lile@Michael Answeed。保留文件队列没有意义。你一找到他们就可以把他们的名字打印出来。你真的只需要目录队列。当然,这一切都取决于需要,但查询仍然满足:使用这两种方法打印系统上的所有文件,而不是递归;这是一个面试问题。我做过很多采访,如果我用这样一个问题,我会立即跟进:“你认为一个文件系统中所有文件名的总大小是多少?”:)只要说‘当然,我还可以优化速度,这是因为编写标准输出是昂贵的。
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
 }