📣 Back to School开学季 - VIP通行证5折优惠!蓝莓、Offer多多同步优惠
楼主: PurpleKing
跳转到指定楼层
上一主题 下一主题
收起左侧

狗家 店面

🔗
domosnake 2021-5-19 02:59:44 | 只看该作者
全局:
本帖最后由 domosnake 于 2021-5-19 03:02 编辑

自己写的,作为参考,不知道这个思路对不对
  1. class Solution:
  2.     # one pass, O(n) time
  3.     # really don't need to store all paths since we only return max length
  4.     def longestPath(self, s: str) -> int:
  5.         entries = s.split('\n')
  6.         # stack to track parent dir and level, root level is -1
  7.         stack = [(-1, '')]
  8.         # paths for all entries
  9.         paths = []
  10.         maxLen = -1
  11.         for e in entries:
  12.             level = self.countLevel(e)
  13.             parent_level, parent_dir = stack[-1]
  14.             # trim spaces
  15.             e = e.strip()
  16.             # popping until correct parent dir is found
  17.             while level <= parent_level:
  18.                 stack.pop()
  19.                 parent_level, parent_dir = stack[-1]

  20.             path = parent_dir + '/' + e
  21.             paths.append(path)
  22.             # dir
  23.             if self.isDir(e):
  24.                 stack.append((level, path))
  25.             # image file
  26.             elif self.isImageFile(e):
  27.                 # update max path length for image files
  28.                 maxLen = max(maxLen, len(path))

  29.         return maxLen

  30.     def countLevel(self, s):
  31.         space = 0
  32.         for c in s:
  33.             if c == ' ':
  34.                 space += 1
  35.             else:
  36.                 break
  37.         return space

  38.     def isDir(self, s):
  39.         return '.' not in s

  40.     def isImageFile(self, s):
  41.         return '.jpeg' in s or '.png' in s or '.gif' in s


  42. filestr = '''dir1
  43. dir11
  44. dir12
  45.   picture.jpeg
  46.   dir121
  47. file1.txt
  48. dir2
  49. verylongfilename2.gif'''
  50. s = Solution()
  51. a = s.longestPath(filestr)
  52. # '/dir2/verylongfilename2.gif' = 27
  53. print(a)
复制代码



回复

使用道具 举报

🔗
domosnake 2021-5-19 03:05:46 | 只看该作者
全局:
感觉是deserialize string back to data structure。这个题因为是返回最大值,所以应该用不到tree或者dfs, 每一行算下最大值(图片文件)
回复

使用道具 举报

🔗
 楼主| PurpleKing 2021-6-10 08:22:03 | 只看该作者
全局:
匿名者 发表于 2021-5-15 13:45
反着遍历list里的string,并用hashmap建一个n-ary tree。 最后pre-order traversal 这个树输出结果。 time  ...

请问为什么要反着遍历list里的string? 能具体说一下吗?
回复

使用道具 举报

🔗
Falldawn 2021-6-11 11:39:34 | 只看该作者
全局:
ND0406 发表于 2021-5-15 15:15
答案跟前面一样 创建一个node with multiple children。 不需要sort直接就开始塞。
赛完了dfs输出结果
时间 ...

我感觉也是这样,直接用HashMap创建一个一对多的图,然后DFS遍历图即可
回复

使用道具 举报

🔗
Falldawn 2021-6-11 12:51:21 | 只看该作者
全局:
写出来了,就是建图+DFS,当然输出的顺序和上面不一样,但是结果是对的。 还请多多加米,多谢!
root = "",root对应的都是一级folder和文件。

这题还是有容易出问题的地方,比如"file3.html",这里没有"/"所以直接是对应root


  1. private static final String DASH = "-";
  2.     public List<String> getAllDirectories(String[] input) {
  3.         List<String> res = new ArrayList<>();
  4.         if (input == null || input.length == 0) {
  5.             return res;
  6.         }
  7.         Map<String, Set<String>> graph = new HashMap<>();
  8.         buildGraph(input, graph);
  9.         StringBuilder soluPrefix = new StringBuilder();
  10.         getDirectories(res, graph, soluPrefix, "");
  11.         return res;
  12.     }

  13.     private void buildGraph(String[] input, Map<String, Set<String>> graph) {
  14.         graph.putIfAbsent("", new HashSet<>());
  15.         for (String s: input) {
  16.             String[] cur = s.split("/");
  17.             if (cur.length == 1) {
  18.                graph.get("").add(cur[0]);
  19.             } else {
  20.                 graph.get("").add(cur[1]);
  21.             }
  22.             for (int i = 1; i < cur.length; i++) {
  23.                 graph.putIfAbsent(cur[i - 1], new HashSet<>());
  24.                 graph.get(cur[i - 1]).add(cur[i]);
  25.    [/i]         }
  26.         }
  27.     }

  28.     private void getDirectories(List<String> res, Map<String, Set<String>> graph, StringBuilder soluPrefix, String cur) {
  29.         if (graph.get(cur) == null) {
  30.             return;
  31.         }
  32.         for (String next: graph.get(cur)) {
  33.             int len = soluPrefix.length();
  34.             soluPrefix.append(DASH).append(next);
  35.             res.add(soluPrefix.toString());
  36.             soluPrefix.setLength(len + 1);
  37.             getDirectories(res, graph, soluPrefix, next);
  38.             soluPrefix.setLength(len);
  39.         }
  40.     }
复制代码
回复

使用道具 举报

🔗
Falldawn 2021-6-11 13:17:40 | 只看该作者
全局:
BFS,注意的是这里只用了一个StringBuilder,所以在BFS时先加上“-”,然后再加下一个节点,放入结果后要删除刚添加的节点方便下一个节点用。
比如 -dir1已经加入到结果种,要删除dir1,还原StringBuilder,所以下一个就是"-dir3"了


  1. public List<String> getAllDirectoriesBFS(String[] input) {
  2.    List<String> res = new ArrayList<>();
  3.    if (input == null || input.length == 0) {
  4.       return res;
  5.    }
  6.    Map<String, Set<String>> graph = new HashMap<>();
  7.    buildGraph(input, graph);
  8.    getDirectoriesBFS(res, graph);
  9.    return res;
  10. }

  11. private void buildGraph(String[] input, Map<String, Set<String>> graph) {
  12.    graph.putIfAbsent("", new HashSet<>());
  13.    for (String s: input) {
  14.       String[] cur = s.split("/");
  15.       if (cur.length == 1) {
  16.           graph.get("").add(cur[0]);
  17.       } else {
  18.          graph.get("").add(cur[1]);
  19.       }
  20.       for (int i = 1; i < cur.length; i++) {
  21.          graph.putIfAbsent(cur[i - 1], new HashSet<>());
  22.          graph.get(cur[i - 1]).add(cur[i]);
  23.       }
  24.    }
  25. }

  26. private void getDirectoriesBFS(List<String> res, Map<String, Set<String>> graph) {
  27.    StringBuilder soluPrefix = new StringBuilder();
  28.    Queue<String> queue = new ArrayDeque<>();
  29.    queue.offer("");
  30.    while (!queue.isEmpty()) {
  31.       int size = queue.size();
  32.       soluPrefix.append(DASH);
  33.       for (int i = 0; i < size; i++) {
  34.          String cur = queue.poll();
  35.          Set<String> nextSet = graph.get(cur);
  36.          if (nextSet == null) {
  37.             continue;
  38.          }
  39.          int len = soluPrefix.length();
  40.          for (String next : nextSet) {
  41.             soluPrefix.append(next);
  42.             res.add(soluPrefix.toString());
  43.             soluPrefix.setLength(len);
  44.             queue.offer(next);
  45.          }
  46.       }
  47.    }
  48. }
复制代码
回复

使用道具 举报

🔗
Falldawn 2021-6-12 09:43:04 | 只看该作者
全局:
本帖最后由 Falldawn 于 2021-6-12 09:53 编辑

昨天想想就感觉不对,这个明显用DFS/BFS是杀鸡用牛刀了,其实Stack就可以了,StringBuilder作为stack就可以了,只不过如果想要输出那种格式还需要一开始就同时用一个Set和List

  1. private static final String DASH = "-";
  2. public Set<String> getAllDirectoriesSimple(String[] input) {
  3.         Set<String> res = new HashSet<>();
  4.         if (input == null || input.length == 0) {
  5.             return res;
  6.         }
  7.         StringBuilder sb = new StringBuilder();
  8.         sb.append(DASH);
  9.         int depth = 1;
  10.         for (String s: input) {
  11.             if (s.charAt(0) == '/') {
  12.                 for (int i = 1; i < s.length(); i++) {
  13.                     char c = s.charAt(i);
  14.                     if (c == '/') {
  15.                         res.add(sb.toString());
  16.                         sb.setLength(count);
  17.                         depth++;
  18.                         sb.append(DASH);
  19.                     } else {
  20.                         sb.append(c);
  21.                     }
  22.                 }
  23.                 res.add(sb.toString());
  24.                 depth = 1;
  25.             } else {
  26.                 sb.append(s);
  27.                 res.add(sb.toString());
  28.             }
  29.             sb.setLength(1);
  30.         }
  31.         return res;
  32.     }
复制代码

回复

使用道具 举报

🔗
Falldawn 2021-6-12 09:51:22 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

🔗
Falldawn 2021-6-12 12:39:29 | 只看该作者
全局:
本帖最后由 Falldawn 于 2021-6-12 12:42 编辑

感觉一个一个扫描还是太麻烦了,直接split转成array吧,但是感觉狗家就喜欢考Trie和DP,是不是应该用Trie做啊
注意,split之后 所有”/”开始的第一个元素都是空的

  1. private static final String DASH = "-";
  2. public List<String> getAllDirectoriesSimple2(String[] input) {
  3.    List<String> res = new ArrayList<>();
  4.    Set<String> dict = new HashSet<>();
  5.    if (input == null || input.length == 0) {
  6.       return res;
  7.    }
  8.    StringBuilder sb = new StringBuilder();
  9.    int depth = 0;
  10.    for (String s: input) {
  11.       String[] curFolders = s.split("/");
  12.       for (String curFolder: curFolders)  {
  13.          if (curFolder.isEmpty()) {
  14.             continue;
  15.          }
  16.          sb.append(DASH);
  17.          sb.append(curFolder);
  18.          depth++;
  19.          if (dict.add(sb.toString())) {
  20.             res.add(sb.toString());
  21.          }
  22.          sb.setLength(depth);
  23.       }
  24.       sb.setLength(0);
  25.       depth = 0;
  26.    }
  27.    return res;
  28. }
复制代码

回复

使用道具 举报

🔗
Falldawn 2021-6-12 12:46:38 | 只看该作者
全局:
如果想省时间,那可以每次都建一个StringBuilder,

  1. private static final String DASH = "-";
  2. public List<String> getAllDirectoriesSimple2(String[] input) {
  3.         List<String> res = new ArrayList<>();
  4.         Set<String> dict = new HashSet<>();
  5.         if (input == null || input.length == 0) {
  6.             return res;
  7.         }
  8.         int depth = 0;
  9.         for (String s: input) {
  10.             String[] curFolders = s.split("/");
  11.             for (String curFolder: curFolders)  {
  12.                 if (curFolder.isEmpty()) {
  13.                     continue;
  14.                 }
  15.                 StringBuilder sb = new StringBuilder();
  16.                 depth++;
  17.                 for (int i = 0; i < depth; i++) {
  18.                     sb.append(DASH);
  19.                 }
  20.                 sb.append(curFolder);
  21.                 if (dict.add(sb.toString())) {
  22.                     res.add(sb.toString());
  23.                 }
  24.             }
  25.             depth = 0;
  26.         }
  27.         return res;
  28.     }
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表