回复: 28
跳转到指定楼层
上一主题 下一主题
收起左侧

亚马逊OA - 订单匹配问题

全局:

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

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
刚刚做完的OA,自己做得非常不好,想问问大家的想法。


给定一个订单order数组,代表对应商品的数量,比如{2, 3, 1}代表ABC商品各有2,3,1个。

另外给定一个HashMap,这个map的value是这几种商品的组合,比如{2, 1, 1},
您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 188 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
这需要确保其他商品的数量不超过order中的数量,想来想去,不是一个好方法。

请问大家有什么思路吗?

谢谢!


上一篇:冷门斯伦贝谢昂赛
下一篇:方块店面 和心得 求bless onsite
推荐
PepePls 2018-3-11 08:14:12 | 只看该作者
全局:
我靠LZ怎么拿到oa的
回复

使用道具 举报

推荐
 楼主| heronalps 2018-3-18 13:38:29 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

全局:
求人不如求己...已经搞定了,用的是backtracking,之前想复杂了

  1. /*
  2. 一个淘宝的订单中包含n(10>=n>=1)种商品A1,A2,...,An,每种商品数量分别为a1,a2,...,an个,记做{a1,a2,...,an}(ak>0)。

  3. 订单在仓库生产过程中,仓库为了提升作业效率,会提前对热门组合商品进行预包装。
  4. 假设这n个商品有m(9>=m>=1)个商品组合,每个组合bomk包含A1,A2,...,An的数量分别为{b1,b2,...,bn}(bk>=0,至少存在一个bk>0)



  5. 举例如下:

  6. 订单包含A,B,C商品,数量为{2,3,1},商品组合bom1{2,1,1},bom2{1,1,0},bom3{0,1,1}



  7. 对以上订单匹配给定商品组合,得到的可能匹配结果为:res1.匹配到组合1一套,剩余B商品;res2.匹配到组合2两套,组合3一套,不剩商品;

  8. 现要求订单的最优匹配,最优匹配的原则为:1.匹配组合后,剩余商品种类数越少越好;2.在剩余商品种类数相同的情况下,匹配到的组合种类数越少越好;

  9. 例如上面例子,我们认为res2优于res1。



  10. 现需要编写程序,输入格式为:

  11. n,m

  12. a1,a2,...,an

  13. bom1,b11,b12,...,b1n

  14. bom2,b21,b22,...,b2n

  15. ....

  16. bomm,bm1,bm2,...,bmn



  17. 输入数据的格式说明(数据间使用英文逗号分隔):

  18. 第一行数据:n个商品,m个预包方案

  19. 第二行数据:商品1个数,商品2个数,。。。,商品n个数

  20. 第三行数据:bom1,商品1个数,商品2个数,。。。,商品n个数

  21. 第n-1行数据:。。。。

  22. 第n行数据:bomn,商品1个数,商品2个数,。。。,商品n个数



  23. 针对输入数据找出最优匹配,输出最优匹配的组合及套数,比如针对上面的例子输出:

  24. match result:

  25. bom2*2,bom3*1

  26. 注:输出结果有多个时可以乱序
  27. */

  28. import java.util.ArrayList;
  29. import java.util.HashMap;
  30. import java.util.List;
  31. import java.util.Map;
  32. import java.util.Scanner;

  33. public class Main {
  34.     /** 请完成下面这个函数,实现题目要求的功能 **/
  35.     /** 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^  **/
  36.     private static Map<String, Integer> optimalCombos;
  37.     private static Map<String, Integer> currentCombos;
  38.     private static int minLeftKinds = Integer.MAX_VALUE;

  39.     public static void main(String[] args) {

  40.         List<Integer> order = new ArrayList<Integer>();
  41.         Map<String, List<Integer>> boms = new HashMap<String, List<Integer>>();

  42.         Scanner in = new Scanner(System.in);
  43.         String line = in.nextLine();

  44.         Integer n = Integer.parseInt(line.split(",")[0]);
  45.         Integer m = Integer.parseInt(line.split(",")[1]);

  46.         line = in.nextLine();
  47.         String[] itemCnt = line.split(",");
  48.         for(int i = 0; i < n ; i++){
  49.             order.add(Integer.parseInt(itemCnt[i]));
  50.         }

  51.         for(int i = 0; i < m; i++){
  52.             line = in.nextLine();
  53.             String[] bomInput = line.split(",");
  54.             List<Integer> bomDetail = new ArrayList<Integer>();

  55.             for(int j = 1; j <= n; j++ ){
  56.                 bomDetail.add(Integer.parseInt(bomInput[j]));
  57.             }
  58.             boms.put(bomInput[0], bomDetail);
  59.         }
  60.         in.close();

  61.         Map<String, Integer> res = resolve(order, boms);

  62.         System.out.println("match result:");
  63.         for(String key : res.keySet()){
  64.             System.out.println(key+"*"+res.get(key));
  65.         }
  66.     }

  67.     // write your code here
  68.     public static Map<String, Integer> resolve(List<Integer> order, Map<String, List<Integer>> boms) {
  69.         optimalCombos = new HashMap<>();
  70.         currentCombos = new HashMap<>();
  71.         minLeftKinds = Integer.MAX_VALUE;

  72.         return resolve(order, boms, 1);
  73.     }

  74.     private static Map<String, Integer> resolve(List<Integer> order, Map<String, List<Integer>> boms, int depth) {
  75.         for (int i = 1; i <= boms.size(); i++) {
  76. //            System.out.println("depth = "+ depth);
  77. //            System.out.println("i = " + i);
  78. //            System.out.println("minLeftKinds = " + minLeftKinds);
  79. //            System.out.println("currentCombos:" + currentCombos);
  80. //            System.out.println("optimalCombos:" + optimalCombos);
  81. //            System.out.println("-------------------------------");

  82.             List<Integer> combo = boms.get("bom" + i);
  83.             if (isValidCombo(order, combo)) {
  84.                 deductCombo(order, combo);
  85.                 currentCombos.put("bom" + i, currentCombos.getOrDefault("bom" + i, 0) + 1);

  86.                 resolve(order, boms, depth + 1);

  87.                 addCombo(order, combo);
  88.                 currentCombos.put("bom" + i, currentCombos.get("bom" + i) - 1);
  89.             } else {
  90.                 int leftKinds = kindOfItemsInList(order);
  91.                 if (leftKinds < minLeftKinds) {
  92.                     minLeftKinds = leftKinds;
  93.                     optimalCombos = new HashMap<>(currentCombos);
  94.                 } else if (leftKinds == minLeftKinds) {
  95.                     if (kindOfCombos(currentCombos) < kindOfCombos(optimalCombos)) {
  96.                         optimalCombos = new HashMap<>(currentCombos);
  97.                     }
  98.                 }
  99.             }
  100.         }

  101.         return optimalCombos;
  102.     }

  103.     public static int kindOfItemsInList(List<Integer> list) {
  104.         int count = 0;
  105.         for(int i = 0; i < list.size(); i++) {
  106.             if (list.get(i) > 0) {
  107.                 count++;
  108.             }
  109.         }
  110.         return count;
  111.     }

  112.     public static boolean isValidCombo(List<Integer> items, List<Integer> combo) {
  113.         for (int i = 0; i < combo.size(); i++) {
  114.             if (items.get(i) < combo.get(i)) {
  115.                 return false;
  116.             }
  117.         }
  118.         return true;
  119.     }

  120.     public static void deductCombo(List<Integer> items, List<Integer> combo) {
  121.         for (int i = 0; i < combo.size(); i++) {
  122.             items.set(i, items.get(i) - combo.get(i));
  123.         }
  124.     }

  125.     public static void addCombo(List<Integer> items, List<Integer> combo) {
  126.         for (int i = 0; i < combo.size(); i++) {
  127.             items.set(i, items.get(i) + combo.get(i));
  128.         }
  129.     }

  130.     public static int kindOfCombos(Map<String, Integer> combos) {
  131.         int count = 0;
  132.         for(int i = 1; i <= combos.size(); i++) {
  133.             if (combos.getOrDefault("bom" + i, 0) != 0) {
  134.                 count++;
  135.             }
  136.         }
  137.         return count;
  138.     }
  139. }
复制代码
回复

使用道具 举报

🔗
bambloo 2018-3-11 09:14:25 | 只看该作者
全局:
Backtracking?
新建一个class,里面存{{#C1,#C2,#C3},剩余数量{#A,#B,#C}},
C1,C2,C3依次尝试,试过C3后将答案存在PriorityQueue里,Key的话先比(#A+#B+#C)谁小,相同的话比{#C1,#C2,#C3}谁的0多
回复

使用道具 举报

🔗
cheese_harry 2018-3-11 09:19:25 | 只看该作者
全局:
这个看起来像是 社招的OA啊 楼主投的是实习吗?
回复

使用道具 举报

🔗
wy3148 2018-3-11 19:56:10 | 只看该作者
全局:
这一道典型的中等难度的dfs的问题,楼主在lintcode上搜一下ship orders相关的
回复

使用道具 举报

🔗
 楼主| heronalps 2018-3-12 04:24:24 | 只看该作者
全局:
czcbangkai 发表于 2018-3-10 19:14
我靠LZ怎么拿到oa的

找人组内内推的,等了很久:(
回复

使用道具 举报

🔗
 楼主| heronalps 2018-3-12 04:25:10 | 只看该作者
全局:
cheese_harry 发表于 2018-3-10 20:19
这个看起来像是 社招的OA啊 楼主投的是实习吗?

确实申请的是实习
回复

使用道具 举报

🔗
 楼主| heronalps 2018-3-12 04:25:52 | 只看该作者
全局:
wy3148 发表于 2018-3-11 06:56
这一道典型的中等难度的dfs的问题,楼主在lintcode上搜一下ship orders相关的

不好意思,我没有在Lintcode找到相关的题。你能提供一下题号,或者题目名称吗?谢谢
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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