1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        阿里現(xiàn)在的面試這么難了嗎?

        共 5719字,需瀏覽 12分鐘

         ·

        2020-12-31 06:28

        阿里巴巴是目前全球最大的網(wǎng)上交易市場和商務(wù)交流社區(qū),其地位是不可撼動(dòng)的,沒點(diǎn)真本事真的不容易進(jìn)里面工作。今天所長在V2EX里看到有人吐槽阿里現(xiàn)在的面試這么難了嗎?一起看看怎么個(gè)難法。


         ? //經(jīng)過我的抽象大致是這樣的,重量和數(shù)量問題不用考慮
        ? ?public static class Product{}
        ? ?public static class Package{}
        ? ?//此物品是否在包裹中
        ? ?public boolean productInPackage(Package packet, Product product) { ***** }

        ? ?//完成此方法: 每個(gè)背包可以有某些物品任意件,找出最少的背包包含所有的物品
        ? ?public Map findLeastPackages(List products, List packages) {}



        ?
        ?public static class Product{}
        ? ?public static class Package{}
        ? ?public boolean productInPackage(Package packet, Product product) {}

        ? ?// n 個(gè)背包, m 個(gè)物品, 每個(gè)背包可以有某些物品任意件, 找出最少的背包包含所有的物品 ?注: 此題一定有解
        ? ?//不考慮背包的權(quán)重、背包中物品權(quán)重、物品數(shù)量和重量
        ? ?public Map findLeastPackages(List products, List packages) {

        ? ? ? ?if (products == null || products.isEmpty() || packages == null || packages.isEmpty()) {
        ? ? ? ? ? ?return null;
        ? ? ? ?}

        ? ? ? ?Set productSet = new HashSet<>(products);
        ? ? ? ?Set packageSet = new HashSet<>(packages);

        ? ? ? ?int productsSize = productSet.size();
        ? ? ? ?int packagesSize = packageSet.size();

        ? ? ? ?//返回值
        ? ? ? ?Map priorityPackages = new HashMap<>(productsSize);

        ? ? ? ?//包裹 <=> 包裹里物品的雙向?qū)?yīng)
        ? ? ? ?//可以使用 Guava 的 Bimap
        ? ? ? ?Map> allPackages = new HashMap<>(packagesSize);
        ? ? ? ?Map, Package> productSetPackage = new HashMap<>(packagesSize);

        ? ? ? ?//尋找到包含數(shù)量物品種類最大的包裹
        ? ? ? ?Package maxProductsPackage = null;
        ? ? ? ?Set productTempSet = 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;
        ? ? ? ? ? ?}
        ? ? ? ?}

        ? ? ? ?//已經(jīng)找到背包有哪些物品
        ? ? ? ?//開始集合運(yùn)算

        ? ? ? ?//maxProductsPackage 種類最多, 說明這個(gè)一定是最優(yōu)里面的
        ? ? ? ?//maxProductsPackage 包含所有種類 直接返回
        ? ? ? ?if (allPackages.get(maxProductsPackage).size() == productSet.size()) {
        ? ? ? ? ? ?for (Product product : productSet) {
        ? ? ? ? ? ? ? ?priorityPackages.put(product, maxProductsPackage);
        ? ? ? ? ? ?}

        ? ? ? ? ? ?return priorityPackages;
        ? ? ? ?}

        ? ? ? ?//todo 機(jī)試的就寫道這里 ?主要記不太清楚集合的交叉并補(bǔ) API,時(shí)間也不足 ?(40 分鐘白板寫代碼)
        ? ? ? ?//沒有使用 lambda 、Stream API 主要是記憶問題(白板寫代碼), 還有通過數(shù)組包裝局部變量, 還有多層循環(huán) break


        ? ? ? ?// 1.刪除 maxProductsPackage 子集的包裹
        ? ? ? ?// 2.找到其他包裹和 maxProductsPackage 差值最大的包裹, 并取并集作為新的 maxProductsPackage
        ? ? ? ?// 3.判斷 maxProductsPackage 是否包含所有物品, 是的話返回, 不是的話重復(fù)第一步直到找到結(jié)果或集合為空(一定有答案)

        ? ? ? ?Set maxProducts = allPackages.get(maxProductsPackage);
        ? ? ? ?Set secondMaxProducts = null;

        ? ? ? ?//刪除最大包裹
        ? ? ? ?allPackages.remove(maxProductsPackage);

        ? ? ? ?//留下來的包裹 [不在最大包裹之內(nèi), 有差值, 但不是差值最大的] ?找到差值最大的合并到 maxProducts, 然后轉(zhuǎn)移到 mergeSets
        ? ? ? ?HashSet> remainSets = new HashSet<>(allPackages.values());

        ? ? ? ?//和最大包裹差值最大的, 已經(jīng)合并到最大包裹內(nèi) [結(jié)果一定在這個(gè)里面]
        ? ? ? ?Set> mergeSets = new HashSet<>(packagesSize);
        ? ? ? ?mergeSets.add(maxProducts);

        ? ? ? ?while (maxProducts.size() != productsSize) {

        ? ? ? ? ? ?//如果 remainSets 為空,且 maxProducts.size() != productsSize 說明沒有答案[不會(huì)發(fā)生]
        ? ? ? ? ? ?//可以把所有包裹相加去重后如果!= productsSize, 說明沒有答案, 這樣可以更快排除,這里只是以防萬一
        ? ? ? ? ? ?if (remainSets.isEmpty()) {
        ? ? ? ? ? ? ? ?return null;
        ? ? ? ? ? ?}

        ? ? ? ? ? ?//尋找次大的包裹, 不需要比較優(yōu)先級(jí) [使用 iterator 模式刪除元素, 優(yōu)化循環(huán)]
        ? ? ? ? ? ?Iterator> iterator = remainSets.iterator();

        ? ? ? ? ? ?while (iterator.hasNext()) {

        ? ? ? ? ? ? ? ?Set next = 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;
        ? ? ? ? ? ? ? ?}
        ? ? ? ? ? ?}

        ? ? ? ? ? ?// 已經(jīng)找完,退出循環(huán)
        ? ? ? ? ? ?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;
        ? ?}


        面試難不難,因人而異,因職位而異,因部門而異。想通過面試,能力當(dāng)然不用說,綜合素質(zhì)也很重要,運(yùn)氣也占了一部分。



        所長整理了一下關(guān)于算法面試的建議:

        1.首先應(yīng)抓緊時(shí)間仔細(xì)審題。

        2.算法面試過程中交流很重要。算法面試中不要求“做完”,也不要求“最優(yōu)解”,重要的是交流。與面試官確定題目信息,數(shù)據(jù)范圍,闡述對題目的理解,以及準(zhǔn)備使用的算法,思路要構(gòu)建起來。

        網(wǎng)友的建議:就算把下面這段話說給面試官聽, 大概率也不會(huì)直接產(chǎn)生技術(shù)不錯(cuò)的印象。“我 JDK 重要源碼學(xué)了一遍又一半,HotSpot 源碼也有所涉獵,研究JDK 的BlockingQueue、ConcurrentLinkedQueue、WorkStealingQueue,JCtools 的 SPSC 、MPSC 、MPMC,Disruptor RingBuffer, 學(xué)習(xí)各種 lock-free 算法和結(jié)構(gòu),心想自己技術(shù)水平還算可以,沒想到折戟在這里?!?/span>

        3.“做完”,一般算法面試的代碼量不會(huì)很大,如果能寫出上百行,那么可能是做法有問題。不過由于題目不全,或許真就很復(fù)雜呢...

        “最優(yōu)解”,在無法一步到位的情況下,可以使用 brute force 。面試官會(huì)根據(jù)他對這個(gè)職位的期望,引導(dǎo)你尋找更優(yōu)解,或者將最優(yōu)解的算法作為你完成 brute force 之后的 follow up 。

        4.臨危不懼的心態(tài)。準(zhǔn)備的正好不在面試官面的點(diǎn)上,不要著急,心態(tài)放好,繼續(xù)加油。腹內(nèi)有能力,胸中有乾坤,相信自己才能無畏艱難。


        最后奉上一位大佬對面試的看法。




        瀏覽 82
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            麻豆影视在线观看全集在线播放 | 人人操人人操人人 | 免费看黄91 | 在线主播精品国产 | 操逼免费视频大全 | 失禁おもらし漏尿网站 | 花久久久久久 | 成人免费看AAA片 | 91视频下载污 | 大奶一区|