每日一题(2022-5-24):经典搜索算法

题目

给定一个文件目录的路径,统计这个目录下所有的文件数并返回

分析

这道题很容易想到深搜或者广搜,不仅考察了对搜索算法的应用,还考察了对文件的操作,这道题在面试的时候还是很常见的
直接看代码吧,边看注释边讲。

代码

深度搜素:

public static int dfs(String folderPath) {
    File root = new File(folderPath);
    // 如果传过来的参数不是目录,直接返回 0
    if (!root.isDirectory()) {
      return 0;
    }
    // 如果传过来的路径是一个文件,直接返回 1
    if (root.isFile()) {
      return 1;
    }
    // 创建一个栈,把传过来的目录入栈
    Stack<File> stack = new Stack<>();
    stack.push(root);
    int files = 0;

    while (!stack.isEmpty()) {
      File folder = stack.pop();
      // 去遍历目录下的所有文件
      for (File file : folder.listFiles()) {
        // 如果 file 是目录就入栈,是文件就 files++
        if (file.isDirectory()) {
          stack.push(file);
        } else if (file.isFile()) {
          files++;
        }
      }
    }
    return files;
  }

广度搜索:

  public static int bfs(String folderPath) {
    File root = new File(folderPath);
    // 如果传过来的参数不是目录,直接返回 0
    if (!root.isDirectory()) {
      return 0;
    }
    // 如果传过来的路径是一个文件,直接返回 1
    if (root.isFile()) {
      return 1;
    }
    // 创建一个队列
    Deque<File> queue = new LinkedList<>();
    queue.add(root);
    int files = 0;

    // 遍历队列
    while (!queue.isEmpty()) {
      // 从队头取出一个 folder
      File folder = queue.pollFirst();
      // 遍历这个 folder 的子目录,是目录就加到队尾,是文件 files++
      for (File file : folder.listFiles()) {
        if (file.isDirectory()) {
          queue.addLast(file);
        } else if (file.isFile()) {
          files++;
        }
      }
    }
    return files;
  }
posted @ 2022-05-24 18:30  fengzeng  阅读(98)  评论(0)    收藏  举报