楼主: 匿名
跳转到指定楼层
上一主题 下一主题
收起左侧

Stripe电面

 
🔗
Falldawn 2021-6-13 00:25:49 | 只看该作者
全局:
第一问类似于953. Verifying an Alien Dictionary,需要保持顺序,直接用index作为顺序即可。然后可以用minHeap或者TreeSet来实现排序即可


  1. private static final String SPLITTER = ", ";
  2.     public List<String> getSupportedLanguagesForBoth(String headers, Set<String> supportedLanguagesForSever) {
  3.         List<String> res = new ArrayList<>();
  4.         if (headers == null || headers.isEmpty() || supportedLanguagesForSever == null || supportedLanguagesForSever.isEmpty())  {
  5.             return res;
  6.         }
  7.         String[] supportedLanguagesForClient = headers.split(SPLITTER);
  8.         int n = supportedLanguagesForClient.length;
  9.         Map<String, Integer> orderMap = new HashMap<>();
  10.         for (int i = 0; i < n; i++) {
  11.             orderMap.put(supportedLanguagesForClient[i], i);
  12.         }
  13.         PriorityQueue<String> minHeap = new PriorityQueue<>((a, b) -> Integer.compare(orderMap.get(a), orderMap.get(b)));
  14.         for (String serverLanguage: supportedLanguagesForSever) {
  15.             if (orderMap.containsKey(serverLanguage)) {
  16.                 minHeap.offer(serverLanguage);
  17.             }
  18.         }
  19.         while (!minHeap.isEmpty()) {
  20.             res.add(minHeap.poll());
  21.         }
  22.         return res;
  23.     }
复制代码
回复

使用道具 举报

🔗
Falldawn 2021-6-13 02:36:35 | 只看该作者
全局:
Falldawn 发表于 2021-6-13 00:25
第一问类似于953. Verifying an Alien Dictionary,需要保持顺序,直接用index作为顺序即可。然后可以用min ...

第一问根本不需要排序,直接遍历


  1. private static final String SPLITTER = ", ";
  2.     public List<String> getSupportedLanguagesForBoth(String headers, Set<String> supportedLanguagesForSever) {
  3.         List<String> res = new ArrayList<>();
  4.         if (headers == null || headers.isEmpty() || supportedLanguagesForSever == null || supportedLanguagesForSever.isEmpty())  {
  5.             return res;
  6.         }
  7.         String[] supportedLanguagesForClient = headers.split(SPLITTER);
  8.         int n = supportedLanguagesForClient.length;
  9.         for (String curLang: supportedLanguagesForClient) {
  10.             if (supportedLanguagesForSever.contains(curLang)) {
  11.                 res.add(curLang);
  12.             }
  13.         }
  14.         return res;
  15.     }
复制代码
回复

使用道具 举报

🔗
Falldawn 2021-6-13 02:54:53 | 只看该作者
全局:
本帖最后由 Falldawn 于 2021-6-13 03:51 编辑

第二问只需要多加一个HashMap用来存<tag, all Language tags>就可以了,由于不能删set还要去重,那就再加一个set来判断之前结果是否加过了,否则可以用List.contains耗时间
  1. private static final String SPLITTER = ", ";
  2. public List<String> getSupportedLanguagesForBoth2(String headers, Set<String> supportedLanguagesForSever) {
  3.         List<String> res = new ArrayList<>();
  4.         Set<String> resSet = new HashSet<>();
  5.         if (headers == null || headers.isEmpty() || supportedLanguagesForSever == null || supportedLanguagesForSever.isEmpty())  {
  6.             return res;
  7.         }
  8.         Map<String, Set<String>> tagMap = new HashMap<>();
  9.         for (String curLang: supportedLanguagesForSever) {
  10.             String curTag = curLang.substring(0, 2);
  11.             tagMap.putIfAbsent(curTag, new HashSet<>());
  12.             tagMap.get(curTag).add(curLang);
  13.         }
  14.         String[] supportedLanguagesForClient = headers.split(SPLITTER);
  15.         for (String curLang: supportedLanguagesForClient) {
  16.             if (supportedLanguagesForSever.contains(curLang)) {
  17.                 resSet.add(curLang);
  18.                 res.add(curLang);
  19.             } else if (tagMap.containsKey(curLang)){
  20.                 for (String s: tagMap.get(curLang)) {
  21.                     if (resSet.add(s)) {
  22.                         res.add(s);
  23.                     }
  24.                 }
  25.             }
  26.         }
  27.         return res;
  28.     }
复制代码

评分

参与人数 1大米 +2 收起 理由
yuki0715 + 2 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
Falldawn 2021-6-13 03:02:25 | 只看该作者
全局:
本帖最后由 Falldawn 于 2021-6-13 03:52 编辑

第三问,那就直接多加一个条件判断,把其他所有语言加进来,这里也要去重

  1. private static final String SPLITTER = ", ";
  2. private static final String WILD_CARD = "*";
  3. public List<String> getSupportedLanguagesForBoth3(String headers, Set<String> supportedLanguagesForSever) {
  4.         List<String> res = new ArrayList<>();
  5.         Set<String> resSet = new HashSet<>();
  6.         if (headers == null || headers.isEmpty() || supportedLanguagesForSever == null || supportedLanguagesForSever.isEmpty())  {
  7.             return res;
  8.         }
  9.         Map<String, Set<String>> tagMap = new HashMap<>();
  10.         for (String curLang: supportedLanguagesForSever) {
  11.             String curTag = curLang.substring(0, 2);
  12.             tagMap.putIfAbsent(curTag, new HashSet<>());
  13.             tagMap.get(curTag).add(curLang);
  14.         }
  15.         String[] supportedLanguagesForClient = headers.split(SPLITTER);
  16.         for (String curLang: supportedLanguagesForClient) {
  17.             if (supportedLanguagesForSever.contains(curLang)) {
  18.                 resSet.add(curLang);
  19.                 res.add(curLang);
  20.             } else if (tagMap.containsKey(curLang)){
  21.                 for (String s: tagMap.get(curLang)) {
  22.                     if (resSet.add(s)) {
  23.                         res.add(s);
  24.                     }
  25.                 }
  26.             } else if (curLang.equals(WILD_CARD)) {
  27.                 for (String s: supportedLanguagesForSever) {
  28.                     if (resSet.contains(s)) {
  29.                         res.add(s);
  30.                     }
  31.                 }
  32.             }
  33.         }
  34.         return res;
  35.     }
复制代码


回复

使用道具 举报

🔗
Falldawn 2021-6-13 03:49:24 | 只看该作者
全局:
第4问有点麻烦,首先需要排序,用max Heap,其次排序需要根据tag对应的q值,需要一个HashMap,最后还需要一个set记录已经去重,后面遇到*号不要再加了
所有测试都通过了


  1. private static final String SPLITTER = ", ";
  2. private static final String WILD_CARD = "*";
  3. private static final String WEIGHT_SEPARATOR = ";";
  4.     public List<String> getSupportedLanguagesForBoth4(String headers, Set<String> supportedLanguagesForSever) {
  5.         List<String> res = new ArrayList<>();
  6.         if (headers == null || headers.isEmpty() || supportedLanguagesForSever == null || supportedLanguagesForSever.isEmpty())  {
  7.             return res;
  8.         }
  9.         Map<String, Set<String>> tagMap = new HashMap<>();
  10.         for (String curLang: supportedLanguagesForSever) {
  11.             String curTag = curLang.substring(0, 2);
  12.             tagMap.putIfAbsent(curTag, new HashSet<>());
  13.             tagMap.get(curTag).add(curLang);
  14.         }
  15.         Map<String, Double> weightMap = new HashMap<>();
  16.         PriorityQueue<String> maxHeap = new PriorityQueue<>((a, b) -> Double.compare(weightMap.get(b), weightMap.get(a)));
  17.         Set<String> tagSetAlreadySet = new HashSet<>();
  18.         String[] supportedLanguagesForClient = headers.split(SPLITTER);
  19.         for (String curHeaderTag: supportedLanguagesForClient) {
  20.             String[] curHeaderTagArray = curHeaderTag.split(WEIGHT_SEPARATOR);
  21.             String curTag = curHeaderTagArray[0];
  22.             double curTagWeight = Double.parseDouble(curHeaderTagArray[1].substring(2));
  23.             if (supportedLanguagesForSever.contains(curTag)) {
  24.                 tagSetAlreadySet.add(curTag);
  25.                 weightMap.put(curTag, curTagWeight);
  26.                 maxHeap.offer(curTag);
  27.             } else if (tagMap.containsKey(curTag)){
  28.                 for (String curLang: tagMap.get(curTag)) {
  29.                     if (tagSetAlreadySet.add(curLang)) {
  30.                         weightMap.put(curLang, curTagWeight);
  31.                         maxHeap.offer(curLang);
  32.                     }
  33.                 }
  34.             } else if (curTag.equals(WILD_CARD)) {
  35.                 for (String curLang : supportedLanguagesForSever) {
  36.                     if (!tagSetAlreadySet.contains(curLang)) {
  37.                         weightMap.put(curLang, curTagWeight);
  38.                         maxHeap.offer(curLang);
  39.                     }
  40.                 }
  41.             }
  42.         }
  43.         while (!maxHeap.isEmpty()) {
  44.             res.add(maxHeap.poll());
  45.         }
  46.         return res;
  47.     }
复制代码
回复

使用道具 举报

🔗
lloydrodman 2021-6-20 02:26:04 | 只看该作者
全局:
Falldawn 发表于 2021-6-13 00:25
第一问类似于953. Verifying an Alien Dictionary,需要保持顺序,直接用index作为顺序即可。然后可以用min ...

没必要这么复杂吧,直接在headers里顺序看是不是支持, 是的话加到res里不就行了?
回复

使用道具 举报

🔗
Falldawn 2021-6-20 02:33:00 | 只看该作者
全局:
lloydrodman 发表于 2021-6-20 02:26
没必要这么复杂吧,直接在headers里顺序看是不是支持, 是的话加到res里不就行了?

是,我后面的帖子写了
回复

使用道具 举报

全局:
想问一下楼主 店面是需要编译通过这种吗?
回复

使用道具 举报

🔗
kakaly 2021-8-1 06:59:55 | 只看该作者
全局:
use priority queues
回复

使用道具 举报

🔗
mayuaner 2021-8-3 02:23:58 | 只看该作者
全局:
我只搞了三问。多谢楼主分享
回复

使用道具 举报

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

本版积分规则

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