【问题标题】:Print all the files in a given folder and sub-folders without using recursion/stack在不使用递归/堆栈的情况下打印给定文件夹和子文件夹中的所有文件
【发布时间】:2012-10-19 10:04:31
【问题描述】:

我最近接受了一家知名公司的软件开发人员职位面试,这是被问到的问题之一:

“给定以下方法:

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

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

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

我想了想,给了面试一个非常明显的递归解决方案。然后她告诉我不要递归地做。由于递归使用调用堆栈,我告诉她我将使用辅助堆栈,此时她告诉我也不要使用堆栈。不幸的是,我无法提出解决方案。我确实问过如何在没有递归/堆栈的情况下完成,但她不会说。

如何做到这一点?

【问题讨论】:

  • 是否允许将完整路径名存储在变量中?
  • 我不确定..我没有问面试官这个!

标签: algorithm data-structures language-agnostic


【解决方案1】:

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

【讨论】:

  • 保持文件队列毫无意义。您可以在找到他们后立即打印出他们的名字。你真的只需要目录队列。
  • 当然,一切看需要,但查询还是满足的:用这2种方法打印出系统上的所有文件,不递归。
  • 我认为需要的是找到一份工作;这是一个面试问题。我已经进行了很多采访,如果我使用了这样的问题,我立即跟进的是:“你认为文件系统中所有文件名的总大小是多少?” :) 只是说'
  • 当然,我还可以优化速度,因为写入标准输出的成本很高。
【解决方案2】:

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

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

编辑:我认为 OP 想要实现 subDirectories()filesInDirectories() 函数。

因此,您可以执行类似打印所有文件(一种伪代码)之类的操作:

List subd = subDirectories(current_dir);
List files = filesInDirectories(current_dir);

foreach (file in files) {
    print file.name();
}

while (!subd.empty()) {
    dir = subd.pop();

    files = filesInDirectory(dir.name());

    foreach (file in files) {
        print file.name();
    }

    subd.append(subDirectories(dir.path()));
}

【讨论】:

  • 是的,但问题要求我打印文件系统中的所有文件,而不仅仅是特定目录中的文件。这是否意味着我需要跟踪我当前所在的目录以及以前的目录以便回溯?
  • 所以,你可以使用 BFS 里尔 @Michael 回答。
【解决方案3】:

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

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

除了面试问题,我想我仍然会选择一个真正的堆栈而不是字符串操作......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2020-05-16
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多