阿里现在的面试这么难了吗?
17coding技术博客
共 5719字,需浏览 12分钟
· 2020-12-31
阿里巴巴是目前全球最大的网上交易市场和商务交流社区,其地位是不可撼动的,没点真本事真的不容易进里面工作。今天所长在V2EX里看到有人吐槽阿里现在的面试这么难了吗?一起看看怎么个难法。
//经过我的抽象大致是这样的,重量和数量问题不用考虑
public static class Product{}
public static class Package{}
//此物品是否在包裹中
public boolean productInPackage(Package packet, Product product) { ***** }
//完成此方法: 每个背包可以有某些物品任意件,找出最少的背包包含所有的物品
public Map findLeastPackages(List products, List packages) {}
public static class Product{}
public static class Package{}
public boolean productInPackage(Package packet, Product product) {}
// n 个背包, m 个物品, 每个背包可以有某些物品任意件, 找出最少的背包包含所有的物品 注: 此题一定有解
//不考虑背包的权重、背包中物品权重、物品数量和重量
public MapfindLeastPackages(List products, List packages) {
if (products == null || products.isEmpty() || packages == null || packages.isEmpty()) {
return null;
}
SetproductSet = new HashSet<>(products);
SetpackageSet = new HashSet<>(packages);
int productsSize = productSet.size();
int packagesSize = packageSet.size();
//返回值
MappriorityPackages = new HashMap<>(productsSize);
//包裹 <=> 包裹里物品的双向对应
//可以使用 Guava 的 Bimap
Map> allPackages = new HashMap<>(packagesSize);
Map, Package> productSetPackage = new HashMap<>(packagesSize);
//寻找到包含数量物品种类最大的包裹
Package maxProductsPackage = null;
SetproductTempSet = null;
for (Package aPackage : packageSet) {
if (aPackage == null) {
continue;
}
//初始化 aPackage
allPackages.put(aPackage, (productTempSet = new HashSet<>()));
productSetPackage.put(productTempSet, aPackage);
for (Product product : productSet) {
if (product == null) {
continue;
}
//物品在背包中, 放入背包
if (productInPackage(aPackage, product)) {
allPackages.get(aPackage).add(product);
}
}
if (maxProductsPackage == null) {
maxProductsPackage = aPackage;
} else {
maxProductsPackage = allPackages.get(aPackage).size() >= allPackages.get(maxProductsPackage).size() ? aPackage : maxProductsPackage;
}
}
//已经找到背包有哪些物品
//开始集合运算
//maxProductsPackage 种类最多, 说明这个一定是最优里面的
//maxProductsPackage 包含所有种类 直接返回
if (allPackages.get(maxProductsPackage).size() == productSet.size()) {
for (Product product : productSet) {
priorityPackages.put(product, maxProductsPackage);
}
return priorityPackages;
}
//todo 机试的就写道这里 主要记不太清楚集合的交叉并补 API,时间也不足 (40 分钟白板写代码)
//没有使用 lambda 、Stream API 主要是记忆问题(白板写代码), 还有通过数组包装局部变量, 还有多层循环 break
// 1.删除 maxProductsPackage 子集的包裹
// 2.找到其他包裹和 maxProductsPackage 差值最大的包裹, 并取并集作为新的 maxProductsPackage
// 3.判断 maxProductsPackage 是否包含所有物品, 是的话返回, 不是的话重复第一步直到找到结果或集合为空(一定有答案)
SetmaxProducts = allPackages.get(maxProductsPackage);
SetsecondMaxProducts = null;
//删除最大包裹
allPackages.remove(maxProductsPackage);
//留下来的包裹 [不在最大包裹之内, 有差值, 但不是差值最大的] 找到差值最大的合并到 maxProducts, 然后转移到 mergeSets
HashSet> remainSets = new HashSet<>(allPackages.values());
//和最大包裹差值最大的, 已经合并到最大包裹内 [结果一定在这个里面]
Set> mergeSets = new HashSet<>(packagesSize);
mergeSets.add(maxProducts);
while (maxProducts.size() != productsSize) {
//如果 remainSets 为空,且 maxProducts.size() != productsSize 说明没有答案[不会发生]
//可以把所有包裹相加去重后如果!= productsSize, 说明没有答案, 这样可以更快排除,这里只是以防万一
if (remainSets.isEmpty()) {
return null;
}
//寻找次大的包裹, 不需要比较优先级 [使用 iterator 模式删除元素, 优化循环]
Iterator> iterator = remainSets.iterator();
while (iterator.hasNext()) {
Setnext = iterator.next();
next.removeAll(maxProducts);
//是 maxProducts 的子集
if (next.isEmpty()) {
iterator.remove();
continue;
}
//初始化 secondMaxProducts 可以删除次大元素减小集合
if (secondMaxProducts == null) {
secondMaxProducts = next;
} else {
secondMaxProducts = next.size() > secondMaxProducts.size() ? next : secondMaxProducts;
}
}
// 已经找完,退出循环
if (secondMaxProducts == null || secondMaxProducts.size() == 0) {
break;
}
// 把 secondMaxProducts 加入到 maxProducts
////更新 maxProducts
maxProducts.addAll(secondMaxProducts);
//更新 mergeSets
mergeSets.add(secondMaxProducts);
//删除此元素
remainSets.remove(secondMaxProducts);
secondMaxProducts = null;
}
//mergeSets 即为所求
mergeSets.forEach(set -> set.forEach(product -> priorityPackages.put(product, productSetPackage.get(set))));
return priorityPackages;
}
面试难不难,因人而异,因职位而异,因部门而异。想通过面试,能力当然不用说,综合素质也很重要,运气也占了一部分。
最后奉上一位大佬对面试的看法。
评论
真高!比亚迪员工爆料比亚迪在越南的薪资水平:基本工资480万,全勤奖35万,交通补助20万,餐补110万,每周6天,每天10小时
上一篇:某大公司为逼迫员工离职,竟然把他的工位安排到厕所旁,没想到他直接开始记录领导的如厕时间,还发到公司大群...对此,你怎么看?--完--PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。全文完,感谢你的耐心阅读。如果你还想看到我的文章,请一定给本
开发者全社区
0
太敢穿了!透视纱裙!性感火辣的身材
绝了呀今天的厂花:吴宣仪1995年1月26日,吴宣仪出生于海南省海口市,中国内地流行乐女歌手、影视演员。2016年2月,吴宣仪随宇宙少女发行首张迷你专辑正式出道。2018年4月,她参加《创造101》综艺选秀,获得第二名,成功加入火箭少女101组合。吴宣仪的颜值一直备受称赞,她的五官立体精致,皮肤白皙
逆锋起笔
0
某大公司为逼迫员工离职,竟然把他的工位安排到厕所旁,没想到他直接开始记录领导的如厕时间,还发到公司大群...
上一篇:字节的跳动职级与薪资(2024年)我们与公司间的合作,宛如两艘船只在茫茫大海上相互依靠,共同抵御风浪,携手驶向成功的彼岸。然而,当航向开始产生分歧,或是波涛汹涌的风浪改变了我们的初衷,我们或许应当冷静地选择和平分手,而非在风雨中硬撑。最近,一位网友的遭遇引起了广大职场人的关注和热议。这位网友
开发者全社区
0
金融研究 | 使用Python测量关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
我看阿里的年终奖总算发了!
到4月底了,这两天看朋友圈,发现阿里的年终奖终于发了,问了问老同学,也从网上检索了不少信息,基本搞清楚了阿里今年的年终奖情况。近来来阿里一些集团对绩效等级做了较大的调整,以前的旧绩效系统中,绩效分为3.25、3.5、3.75、4和5五个等级,其中4和5是较高绩效等级,较少见。而且之前3.5绩效内部划
公子龙
0
CVPR 2024|大视觉模型的开山之作!无需任何语言数据即可打造大视觉模型
↑ 点击蓝字 关注极市平台作者丨科技猛兽编辑丨极市平台极市导读 本文提出一种序列建模 (sequential modeling) 的方法,不使用任何语言数据,训练大视觉模型。>>加入极市CV技术交流群,走在计算机视觉的最前沿本文目录1 序列建模打造大视觉模型(来自 U
极市平台
1
金融研究(更新) | 使用Python构建关键审计事项的「信息含量」
Tips: 公众号推送后内容只能更改一次,且只能改20字符。如果内容出问题,或者想更新内容, 只能重复推送。为了更好的阅读体验,建议阅读本文博客版, 链接地址https://textdata.cn/blog/2023-01-13-information-content-of-critical-aud
大邓和他的Python
0
字节的跳动职级与薪资(2024年)
上一篇:阿里公布年终奖,P7, 3.5+,22W年终奖,还有35W长期现金激励,真香字节跳动自2012年3月成立以来,已经迅速成长为一个全球性的科技公司。其产品和服务已经遍布全球150多个国家与地区,并且支持超过75种不同的语言。在字节跳动的官方网站上,列出了一系列引人注目的产品和服务,包括但不限于
开发者全社区
0