我最近接受了一家信誉良好的公司的采访,担任软件开发人员的职位,这是其中一个问题:
“鉴于以下方法:
List subDirectories(String directoryName){ ... };
List filesInDirectory(String directoryName) { ... };
顾名思义,第一种方法返回输入目录('directoryName')中直接子目录的名称列表,第二种方法返回该文件夹中所有文件的名称列表。
打印文件系统中的所有文件。“
我想到了这一点并给了采访一个非常明显的递归解决方案。然后她告诉我没有递归就这样做。由于递归使用了调用堆栈,我告诉她我将使用辅助堆栈,在这一点上她告诉我不要使用堆栈。不幸的是,我无法提出解决方案。我确实问过没有递归/堆栈怎么做,但她不会说。
如何做到这一点?
答案 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
,我们可以说user
和config
都是{{{}的直接子目录1}},但/home/
不是。如果u001
和user
是文件(u001
是即时的,而user
不是),则同样适用。
因此,您不需要递归或堆栈来返回直接子目录或文件的列表。
编辑:我认为OP希望实施u001
和subDirectories()
功能。
所以,你可以做一些事情,比如打印所有文件(伪代码的种类):
filesInDirectories()
答案 2 :(得分:1)
我认为@lqs建议的确是一个她可能一直在寻找的可接受的答案:将完整路径存储在变量中,如果输入子目录,则将目录名附加到它,并剪掉最后一个目录你离开时的名字。这样,您的完整路径就可以作为指向您当前在文件系统中的位置的指针。
因为完整路径总是在最后修改,所以完整路径(不奇怪)就像你的堆栈一样。
除了采访问题之外,我认为我仍然可以通过字符串操作选择真正的堆栈......