《数据科学面试40+真题讲解》,K神本年度最后一次开课


一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
码农求职神器Triplebyte:
不用海投,内推你去多家公司面试
Airbnb 数据科学职位
in analytics and inference
天天打游戏、照样领工资,
你要不要来?
把贵司招聘信息放这里
查看: 4385|回复: 24
收起左侧

word ladder 1.5 如果被challenge用26个char iteration太慢的话,大家怎么optimize?

[复制链接] |试试Instant~ |关注本帖
jyty 发表于 2016-11-27 09:41:16 | 显示全部楼层 |阅读模式

2016(10-12月) 码农类 硕士 全职@Linkedin - 内推 - Onsite |Other在职跳槽

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?Sign Up 注册获取更多干货

x
见过不少面经提到被问到1.5版本,就是只输出一条最短路径,同时还被challenge用26个字符iteration太慢,想问问大家怎么回答这个follow up 的?
solarsys 发表于 2016-11-29 03:23:45 | 显示全部楼层
trieNode 接hashmap  hashmap 的value 继续是trieNode 这样每次获取只有O1
回复 支持 3 反对 0

使用道具 举报

小A要当码农 发表于 2016-11-28 09:49:36 | 显示全部楼层
同关注一下。。。
回复 支持 反对

使用道具 举报

swufejun 发表于 2016-11-28 11:26:09 | 显示全部楼层
. from: 1point3acres.com/bbs
同关注一下。。。 + 1
回复 支持 反对

使用道具 举报

春山寒 发表于 2016-11-28 11:32:11 | 显示全部楼层
是不是可以用trie来做 在每个position 只变化相同level trie里面有的字母
回复 支持 反对

使用道具 举报

xietao0221 发表于 2016-11-29 02:57:49 | 显示全部楼层
iterate太慢是不是能用一个hashmap啊,就用不着遍历26个,有几个iterate几个就好了
回复 支持 反对

使用道具 举报

say543 发表于 2016-12-4 13:42:41 | 显示全部楼层
solarsys 发表于 2016-11-29 03:23
trieNode 接hashmap  hashmap 的value 继续是trieNode 这样每次获取只有O1

不是太懂trieNode接hashmap是什麼意思? trie是同樣的prefixtrie怎麼確定兩個字距離只有1呢由o(1)能不能再說清楚某...求指教....
回复 支持 反对

使用道具 举报

 楼主| jyty 发表于 2016-12-6 14:14:48 | 显示全部楼层
xietao0221 发表于 2016-11-29 02:57
iterate太慢是不是能用一个hashmap啊,就用不着遍历26个,有几个iterate几个就好了
.鐣欏璁哄潧-涓浜-涓夊垎鍦
hashmap的key是啥?
回复 支持 反对

使用道具 举报

say543 发表于 2016-12-8 16:08:00 | 显示全部楼层
懂solarsys method 的童鞋能指教一下吗? 想很久还是不懂...
回复 支持 反对

使用道具 举报

ausgoo 发表于 2016-12-10 02:29:34 | 显示全部楼层
回答twoEnd BFS? 在leetcode discuss上有详解。 我自己试了下,快很多。谢谢。
回复 支持 反对

使用道具 举报

say543 发表于 2016-12-10 15:31:12 | 显示全部楼层
ausgoo 发表于 2016-12-10 02:29
回答twoEnd BFS? 在leetcode discuss上有详解。 我自己试了下,快很多。谢谢。

two way bfs 不知道面试官给不给用 a-z 的enumeration...
回复 支持 反对

使用道具 举报

smallwarm 发表于 2016-12-11 14:31:11 | 显示全部楼层
RE .... 感觉这个非常值得讨论, 同关注!! +1
回复 支持 反对

使用道具 举报

小A要当码农 发表于 2016-12-19 07:07:00 | 显示全部楼层
solarsys 发表于 2016-11-29 03:23. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
trieNode 接hashmap  hashmap 的value 继续是trieNode 这样每次获取只有O1

这也不是O(1)吧, worst case还是每次都是O(26)?
回复 支持 反对

使用道具 举报

yangluphil 发表于 2016-12-19 07:24:39 | 显示全部楼层
可以预处理得到一个graph,每个单词是一个graph node,(V1, V2) is in Edges iff diff(V1, V2) == 1
回复 支持 反对

使用道具 举报

solarsys 发表于 2016-12-20 06:12:19 | 显示全部楼层
最近都没上自己的账号 不过仔细想了想好像hashmap的方法好像是自己误入歧途了。。大家请无视我的误导
回复 支持 反对

使用道具 举报

蓝蓝天了 发表于 2017-3-9 12:10:09 | 显示全部楼层
请问下这样对不对, 在word ladder 基础上 就用了parent hash map backtracking 可以吗?

运行了简单case 可以出正确结果的.鐣欏璁哄潧-涓浜-涓夊垎鍦


  1. import java.util.ArrayDeque;
  2. import java.util.ArrayList;-google 1point3acres
  3. import java.util.Arrays;
  4. import java.util.HashMap;
  5. import java.util.HashSet;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.Queue;
  9. import java.util.Set;

  10. public class WordLadder15 {
  11.         . 1point 3acres 璁哄潧
  12.         Map<String, Set<String>> map = new HashMap<>();
  13.         Map<String, String> pmap = new HashMap<>(); //parents
  14.        
  15.         public List<String> ladderLength(String bw, String ew, List<String> words) {
  16.                 List<String> list = new ArrayList<>(words);
  17.                 if (bw.equals(ew))
  18.                         return null;
  19.                 list.add(bw);
  20.                 list.add(ew);
  21.                 // build graph. 涓浜-涓夊垎-鍦帮紝鐙鍙戝竷
  22.                 for (String w : list) {
  23.                         Set<String> set = new HashSet<>();
  24.                         for (String w2 : list) {
  25.                                 if (!w2.equals(w) && connect(w2, w))
  26.                                         set.add(w2);
  27.                         }
  28.                         map.put(w, set);
  29.                 }
  30.                 Queue<String> q = new ArrayDeque<>();
  31.                 Set<String> seen = new HashSet<>();
  32.                 q.offer(bw);. from: 1point3acres.com/bbs
  33.                 seen.add(bw);
  34.                 while (!q.isEmpty()) {
  35.                         int len = q.size();
  36.                         for (int i = 0; i < len; i++) {.1point3acres缃
  37.                                 String cur = q.poll();.1point3acres缃
  38.                                 Set<String> set = map.get(cur);-google 1point3acres
  39.                                 for (String nei : set) {
  40.                                         if (seen.add(nei)){
  41.                                                 pmap.put(nei, cur);
  42.                                                 q.offer(nei);. 1point 3acres 璁哄潧
  43.                                         }
  44.                                         if (nei.equals(ew))
  45.                                                 return getPath(nei);
  46.                                 }
  47.                         }
  48.                 }.鐣欏璁哄潧-涓浜-涓夊垎鍦
  49.                 return new ArrayList<String>();
  50.         }
  51.         .鐣欏璁哄潧-涓浜-涓夊垎鍦
  52.         private List<String> getPath(String end){
  53.                 List<String> res = new ArrayList<>();. 1point 3acres 璁哄潧
  54.                 String parent=end;
  55.                 while(parent!=null){
  56.                         res.add(0, parent);
  57.                         parent=pmap.get(parent);. 1point 3acres 璁哄潧
  58.                 }
  59.                 return res;
  60.         }

  61.         // build the graph: which connects with which.鐣欏璁哄潧-涓浜-涓夊垎鍦
  62.         private boolean connect(String a, String b) {. 1point 3acres 璁哄潧
  63.                 int diff = 0;
  64.                 for (int i = 0; i < a.length(); i++) {
  65.                         if (a.charAt(i) != b.charAt(i))
  66.                                 diff++;
  67.                 }
  68.                 return diff == 1;
  69.         }

  70.         public static void main(String[] args) {
  71.                 WordLadder15 sol = new WordLadder15();
  72.                 List<String> res= sol.ladderLength("hit", "cog",.鏈枃鍘熷垱鑷1point3acres璁哄潧
  73.                                 new ArrayList<String>(Arrays.asList("hot", "dot", "dog", "lot", "log", "cog")));
  74.                 for(String s: res) System.out.println(" "+ s);
  75.         }
    . Waral 鍗氬鏈夋洿澶氭枃绔,

  76. }. From 1point 3acres bbs
复制代码
回复 支持 反对

使用道具 举报

我一辈子赖美帝 发表于 2017-10-15 13:32:39 | 显示全部楼层
贴个我自己polish过的版本,.1point3acres缃
   while 处理queue时不用再遍历size.
                //int len = queue.size();
                //for (int i = 0; i < len; i++) {
. 1point3acres.com/bbs
Map<String, Set<String>> oneCharDiffWords = new HashMap<>();
        Map<String, String> ancestorMap = new HashMap<>();         
        public List<String> ladderLength(String start, String end, List<String> words) {
            List<String> list = new ArrayList<>(words);
            if (start.equals(end))
                return null;
            list.add(start);
            list.add(end);. from: 1point3acres.com/bbs
            for (String S : list) {
                 Set<String> set = new HashSet<>();. visit 1point3acres.com for more.
                 for (String T : list)
                     if (!S.equals(T) && isOneCharDiff(S, T))
                         set.add(T);
               
                 oneCharDiffWords.put(S, set);
            }
            Queue<String> queue = new LinkedList<>();
            Set<String> seen = new HashSet<>();
            queue.offer(start);
            seen.add(start);
            while (!queue.isEmpty()) {. From 1point 3acres bbs
                //int len = queue.size();
. Waral 鍗氬鏈夋洿澶氭枃绔,                //for (int i = 0; i < len; i++) {
                    String cur = queue.poll();
                    Set<String> oneCharDiffWordsSet = oneCharDiffWords.get(cur);
                    for (String str : oneCharDiffWordsSet) {
鏉ユ簮涓浜.涓夊垎鍦拌鍧.                         if (seen.add(str)){.鏈枃鍘熷垱鑷1point3acres璁哄潧
                                ancestorMap.put(str, cur);
                            queue.offer(str);
                        }.鐣欏璁哄潧-涓浜-涓夊垎鍦
                        if (str.equals(end)) return CreatePathFromAncestorMap(str);
                    }
                //}
            }-google 1point3acres
            return new ArrayList<String>();
        }

        private List<String> CreatePathFromAncestorMap(String end){
            List<String> res = new ArrayList<>();
            String ancestor=end;
            while(ancestor!=null){
                res.add(0, ancestor);
                ancestor=ancestorMap.get(ancestor);
            }
            return res;
        }. from: 1point3acres.com/bbs

        private boolean isOneCharDiff(String a, String b) {
            int diff = 0;
            for (int i = 0; i < a.length(); i++)
                if (a.charAt(i) != b.charAt(i))
                    diff++;
            
            return diff == 1;
        }

        public static void main(String[] args) {
                WordLadder1Dot5Way sol = new WordLadder1Dot5Way();
            List<String> res= sol.ladderLength("hit", "lib", new ArrayList<String>(Arrays.asList("cit", "cib", "lib", "hib")));
            for(String s: res) System.out.print(" "+ s);
        }
回复 支持 反对

使用道具 举报

knight0clk 发表于 2017-10-30 07:38:05 | 显示全部楼层
春山寒 发表于 2016-11-28 11:32
是不是可以用trie来做 在每个position 只变化相同level trie里面有的字母

应该是用这个方法,但是感觉速度也不会提高很多
回复 支持 反对

使用道具 举报

本版积分规则

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明

custom counter

GMT+8, 2017-11-24 19:06

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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