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
}