📣 独立日限时特惠: VIP通行证立减$68
楼主: ariesxiao
跳转到指定楼层
上一主题 下一主题
收起左侧

SNAPCHAT电面挂经

🔗
 楼主| ariesxiao 2016-9-9 05:24:01 | 只看该作者
全局:
maktf 发表于 2016-9-8 22:43
求问楼主从面完到有消息用了多久啊?而且他家的店面到底是45分钟还是一个小时?

早上面的,下午就有消息了,问了一下内部的朋友,说最近SNAPCHAT在谈IPO,为了防止有人进去混股票,BAR高了很多,ANYWAY,MOVE FORWARD了
回复

使用道具 举报

🔗
pawprinter 2016-9-14 12:33:40 | 只看该作者
全局:
请问需要考虑顺序吗?输出是list吗?{GAT, DOC} 和 {DOC, GAT} 算几个?
回复

使用道具 举报

🔗
todayand 2016-9-20 08:41:07 | 只看该作者
全局:
因为顺序不重要,所以可以将INPUT STRING ARRAY 2里的string先sort,建个hashmap存sorted string对应原string
对sorted string建Trie,这样可以方便之后搜索

然后对INPUT STRING ARRAY 1, count each char in it,然后就是dfs找出所有可能组合啦
回复

使用道具 举报

🔗
myangelasuka 2016-9-20 18:45:43 | 只看该作者
全局:
大概写了一个。 要backtrack input2 而不是input1
  1. public List<List<String>> wordSearch (String[] input1, String[] input2) {
  2.                 /*
  3.                  * 题大概是这样,一个INPUT STRING ARRAY1 比如CAT, DOG,一个INPUT STRING ARRAY 2, 比如GAT, DOC, CD, GOAT, BAD, COOL
  4.                  * 要求第一个INPUT ARRAY的字母必须全部用,而且每个字母只能用一次,求其能组合成的INPUT STRING ARRAY2里的单词组
  5.                  * 比如上面这个例子,返回值会是{{GAT, DOC},{CD, GOAT}}
  6.                  */
  7.                 //edge cases
  8.                 List<List<String>> ret = new ArrayList<>();
  9.                 StringBuilder input1B = new StringBuilder();
  10.                 for (String s : input1) {
  11.                         char[] arr = s.toCharArray();
  12.                         for (char ch : arr) {
  13.                                 input1B.append(ch);
  14.                         }
  15.                 }
  16.                 backtracking (ret, new ArrayList<String>(), 0 ,input1B.toString().toCharArray(), input2);
  17.                 return ret;
  18.         }
  19.        
  20.         private void backtracking (List<List<String>> ret, List<String> temp, int start, char[] input1, String[] input2) {
  21.                 if (isAnagram(input1, temp)) {
  22.                         ret.add(new ArrayList<>(temp));
  23.                 } else {
  24.                         for (int i = start; i < input2.length; i++) {
  25.                                 temp.add(input2[i]);
  26.                                 backtracking (ret, temp, i+1, input1, input2);
  27.                                 temp.remove(temp.size()-1);
  28.                         }
  29.                 }
  30.         }
  31.        
  32.         private boolean isAnagram (char[] str1, List<String> temp) {
  33.                 int[] trie = new int[26];
  34.                 for (char c : str1) {
  35.                         trie[c-'A']++;
  36.                 }
  37.                 for (String s : temp) {
  38.                         for (int i = 0; i < s.length(); i++) {
  39.                                 trie[s.charAt(i)-'A']--;
  40.                         }
  41.                 }
  42.                 for (int i : trie) {
  43.                         if (i != 0) return false;
  44.                 }
  45.                 return true;
  46.         }
复制代码
回复

使用道具 举报

🔗
白丁117 2016-9-25 11:00:29 | 只看该作者
全局:
感觉没必要用trie...dfs + 剪枝可以把 hashmap<char, int> map l取array1 word总长度, 每次l-- int=0时 map.remove(char), l<array2 中word length时,return
想不出啥优化,等大牛>.
回复

使用道具 举报

🔗
todayand 2016-9-25 11:17:38 | 只看该作者
全局:
白丁117 发表于 2016-9-25 11:00
感觉没必要用trie...dfs + 剪枝可以把 hashmap map l取array1 word总长度, 每次l-- int=0时 map.remove(ch ...

lz说了用trie是因为被要求的,因为input2会被query很多次,trie是个比较合理的数据结构
回复

使用道具 举报

🔗
xietao0221 2016-9-25 12:01:03 | 只看该作者
全局:
如果不用trie的写了这么一个。用trie的还没想,一会儿想想。
  1. public class Solution {
  2.     private List<List<String>> res = new ArrayList<>();
  3.     private List<String> tmpRes = new ArrayList<>();
  4.     private int charSum = 0;
  5.     private int[] charSet = new int[26];

  6.     public List<List<String>> wordSearch(String[] input1, String[] input2) {
  7.         // build charSet
  8.         for(String word: input1) {
  9.             for(char c: word.toCharArray()) {
  10.                 charSet[c - 'A']++;
  11.                 charSum++;
  12.             }
  13.         }

  14.         wordSearchHelper(input2, 0, 0);
  15.         return res;
  16.     }

  17.     private void wordSearchHelper(String[] input2, int pos, int count) {
  18.         if(count > charSum) return;

  19.         if(count == charSum) {
  20.             int[] tmpCharSum = Arrays.copyOf(charSet, 26);
  21.             for(String word: tmpRes) {
  22.                 for(char c: word.toCharArray()) {
  23.                     if (--tmpCharSum[c - 'A'] < 0) return;
  24.                 }
  25.             }
  26.             res.add(new ArrayList<>(tmpRes));
  27.             return;
  28.         }

  29.         for(int i = pos; i < input2.length; i++) {
  30.             tmpRes.add(input2[i]);
  31.             wordSearchHelper(input2, i + 1, count + input2[i].length());
  32.             tmpRes.remove(tmpRes.size() - 1);
  33.         }
  34.     }
  35. }
复制代码

评分

参与人数 2大米 +15 收起 理由
高渐离击筑高歌 + 5 给你点个赞!
忆梦前尘 + 10 回答的很好!

查看全部评分

回复

使用道具 举报

无效楼层,该帖已经被删除
全局:
如果是给定了input2,并且反复调用API给新的input1,我觉得可以先对input2做各种排列组合,得到一个key value pair,key是组合之后所有出现的字母sort之后的string,value是这个key对应的各种组合。然后每次给一个新的input1,先把input1里所有的字母sort后并成一个string(比如例子里的变成ACDGOT),然后直接去key value pair里找对应的组合就好啦。思想类似于anagram吧
回复

使用道具 举报

🔗
freemail165 2016-10-10 06:13:34 | 只看该作者
全局:
ariesxiao 发表于 2016-9-8 11:50
我建立TRIE是因为面试官一直在引导我建TRIE。。他之前跟我说如果INPUT ARRAY 2是不变的,用户CALL我们的A ...

我觉得你被误导了,那如果input2也是变化的,怎么做?
而且trie不应该用在这个场景,trie的话,字母顺序就固定了,现在这个问题不需要固定
回复

使用道具 举报

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

本版积分规则

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