社招 美团一面

1、项目拷打

被质疑项目没啥难点和挑战。。。感觉没提炼好。。。

2、手撕代码

2.1、业务场景题

给你一个Product类,按下面的规则排序。

规则一:找到tag是“理发”,“按摩”,“染发”各自销量最高的一个商品排在最前,这三个商品之间又按照销量降序排列(tag是一个string类型)。

规则二:按是否商家推荐排序(boolean 类型 isRecommand)。

规则三:销量降序排序。

下面代码是通过AI优化之后的,当场写的比较烂

import java.util.*;
import java.util.stream.Collectors;

/**
 * 通用商品排序器,支持动态设置需要优先排序的标签
 */
public class GenericProductSorter {
    
    // 优先排序的标签集合(从外部传入,可动态修改)
    private Set<String> priorityTags;
    // 每个优先标签下取销量最高的商品数量(此处按需求固定为1,也可改为动态参数)
    private int topNPerTag = 1;
    
    /**
     * 构造方法:传入需要优先排序的标签
     * @param priorityTags 优先标签集合(如["理发", "按摩", "染发"])
     */
    public GenericProductSorter(Set<String> priorityTags) {
        this.priorityTags = new HashSet<>(priorityTags); // 防御性拷贝,避免外部修改影响内部
    }
    
    /**
     * 动态修改优先标签
     * @param newPriorityTags 新的优先标签集合
     */
    public void setPriorityTags(Set<String> newPriorityTags) {
        this.priorityTags = new HashSet<>(newPriorityTags);
    }
    
    /**
     * 获取排序比较器(核心方法)
     * @param allProducts 所有商品列表(用于预处理优先商品)
     * @return 符合规则的比较器
     */
    public Comparator<Product> getProductComparator(List<Product> allProducts) {
        // 预处理:根据当前的priorityTags,找出每个标签下销量最高的topNPerTag个商品
        Set<String> topPriorityProducts = findTopPriorityProducts(allProducts);
        
        return (p1, p2) -> {
            // 判断商品是否属于优先商品
            boolean p1IsTopPriority = topPriorityProducts.contains(p1.getId());
            boolean p2IsTopPriority = topPriorityProducts.contains(p2.getId());
            
            // 规则一:优先商品处理
            if (p1IsTopPriority && p2IsTopPriority) {
                // 都是优先商品,按销量降序
                return Integer.compare(p2.getSales(), p1.getSales());
            } else if (p1IsTopPriority) {
                // 只有p1是优先商品,p1在前
                return -1;
            } else if (p2IsTopPriority) {
                // 只有p2是优先商品,p2在前
                return 1;
            }
            
            // 规则二:按是否推荐排序
            if (p1.isRecommand() && !p2.isRecommand()) {
                return -1;
            } else if (!p1.isRecommand() && p2.isRecommand()) {
                return 1;
            }
            
            // 规则三:按销量降序
            return Integer.compare(p2.getSales(), p1.getSales());
        };
    }
    
    /**
     * 找出每个优先标签下销量最高的topNPerTag个商品ID
     */
    private Set<String> findTopPriorityProducts(List<Product> allProducts) {
        Set<String> topProductIds = new HashSet<>();
        
        // 按当前的priorityTags分组处理
        Map<String, List<Product>> productsByTag = allProducts.stream()
                .filter(p -> priorityTags.contains(p.getTag())) // 使用动态设置的优先标签
                .collect(Collectors.groupingBy(Product::getTag));
        
        // 每个标签取销量最高的topNPerTag个商品
        for (List<Product> tagProducts : productsByTag.values()) {
            tagProducts.sort((p1, p2) -> Integer.compare(p2.getSales(), p1.getSales()));
            int limit = Math.min(topNPerTag, tagProducts.size());
            for (int i = 0; i < limit; i++) {
                topProductIds.add(tagProducts.get(i).getId());
            }
        }
        
        return topProductIds;
    }
    
    // 测试:动态修改优先标签的效果
    public static void main(String[] args) {
        // 1. 初始化商品列表(同上)
        List<Product> products = Arrays.asList(
            new Product("1", "理发", true, 150),
            new Product("2", "按摩", false, 200),
            new Product("3", "染发", true, 180),
            new Product("4", "美甲", true, 300),
            new Product("5", "理发", false, 120),
            new Product("6", "美容", false, 90),
            new Product("7", "按摩", true, 250),
            new Product("8", "染发", false, 220),
            new Product("9", "理发", true, 300),
            new Product("10", "染发", true, 150),
            new Product("11", "理发", false, 200),
            new Product("12", "按摩", true, 180)
        );
        
        // 2. 第一次排序:使用默认优先标签["理发", "按摩", "染发"]
        Set<String> defaultTags = new HashSet<>(Arrays.asList("理发", "按摩", "染发"));
        GenericProductSorter sorter = new GenericProductSorter(defaultTags);
        products.sort(sorter.getProductComparator(products));
        System.out.println("=== 优先标签:理发、按摩、染发 ===");
        printProducts(products);
        
        // 3. 第二次排序:动态修改优先标签为["美甲", "美容"]
        Set<String> newTags = new HashSet<>(Arrays.asList("美甲", "美容"));
        sorter.setPriorityTags(newTags); // 修改优先标签
        products.sort(sorter.getProductComparator(products));
        System.out.println("\n=== 优先标签:美甲、美容 ===");
        printProducts(products);
    }
    
    // 辅助方法:打印商品列表
    private static void printProducts(List<Product> products) {
        for (Product p : products) {
            System.out.printf("%s (标签: %s, 销量: %d, 推荐: %s) %n",
                    p.getName(), p.getTag(), p.getSales(), p.isRecommand());
        }
    }
}

// Product类保持不变
class Product {
    private String id;
    private String name;
    private String tag;
    private boolean isRecommand;
    private int sales;
    
    public Product(String id, String tag, boolean isRecommand, int sales) {
        this.id = id;
        this.name = "商品" + id;
        this.tag = tag;
        this.isRecommand = isRecommand;
        this.sales = sales;
    }
    
    // getter方法
    public String getId() { return id; }
    public String getName() { return name; }
    public String getTag() { return tag; }
    public boolean isRecommand() { return isRecommand; }
    public int getSales() { return sales; }
}
    

2.2、算法题

***********

滑动窗口,hard中比较简单的吧,当场给了思路,口胡了一下,但是面试官急着去面试下一个人没打完,今天补题过了。

class Solution {
    public String minWindow(String S, String T) {
        char[] t = T.toCharArray();
        char[] s = S.toCharArray();

        Map<Character, Integer> tar = new HashMap<>();// 记录t字符出现的情况
        for (char c : t) {
            tar.put(c, tar.getOrDefault(c, 0) + 1);
        }

        int l = 0, r = 1;
        String ans = S + T;
        Map<Character, Integer> cur = new HashMap<>(); // 滑动窗口中字符出现的情况
        cur.put(s[0], cur.getOrDefault(s[0], 0) + 1);

        while (r < s.length && l < r) {
            if (check(cur, tar)) {
                if (r - l < ans.length()) {
                    ans = S.substring(l, r);
                }
                cur.put(s[l], cur.get(s[l]) - 1);
                ++l;
            } else {
                cur.put(s[r], cur.getOrDefault(s[r], 0) + 1);
                ++r;
            }
        }

        while (check(cur, tar) && l < r) {
            if (r - l < ans.length()) {
                ans = S.substring(l, r);
            }
            cur.put(s[l], cur.get(s[l]) - 1);
            ++l;
        }

        if (ans.length() > s.length) {
            ans = "";
        }
        return ans;
    }

    private boolean check(Map<Character, Integer> cur, Map<Character, Integer> tar) {
        for (Map.Entry<Character, Integer> entry : tar.entrySet()) {
            if (entry.getValue() > cur.getOrDefault(entry.getKey(), 0)) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        String s = "ADOBECODEBANC", t = "ABC";
        Solution solution = new Solution();
        solution.minWindow(s, t);
    }
}

#美团##社招#
全部评论
华子在日本也有吗
点赞 回复 分享
发布于 2025-09-30 16:15 广东

相关推荐

2025-12-18 00:27
门头沟学院 golang
首先简单的说明下个人情况:25届毕业生,普通一本+211硕,在美团外卖与平台组实习了半年多,然后在现在这家大厂赚钱发动机部门工作了十个多月。暑期实习拿到了小米后端、大疆后端、美团测开以及一些中小厂后端offer,秋招拿到了字节、美团的sp,京东、滴滴的ssp(没有明确定义ssp到底多少薪资,是我在网上所了解到的测开的最高价)以及部分中厂后端(大厂只投测开)。暑期实习主要是60%黑盒测试+40%工具开发建设。目前的主要工作内容:30%的AI测试开发建设,60%的服务端测试,10%的前端页面测试,测试基本是纯白盒测试,自动化建设技术含量甚至不如服务端测试,所以也可以认为是测试内容。首先,测开适合什么人:1、学校背景一般,达不到大厂后端要求。(根据我的工作经验,当前大厂核心部门后端基本是都是中上游9硕,或者北邮西电较多)2、速成选手(项目准备不够充分、八股文场景题准备不够)3、非卷王(后端相比测开需要关注更多的内容,包括处理运营的各种杂事问题、需求评审需要全神贯注、需要cover住自己所负责所有模块的逻辑,以及相关上下游的相关交互等等)简单点用工作时间来衡量就是,测开平均每天比后端少工作1h左右,而且测开需求评审不需要全神贯注,摸鱼时间相对多点)然后,测开不适合什么人:1、对自己要求特别高,追求有挑战的事情。我虽然自己进行AI建设开发类似于全栈,但是难度相比研发简单很多,研发的代码涉及逻辑特别复杂,很多时候一个小改动可能会影响到某个模块,需要评估非常多的内容。2、野心大、愿意担责、能力强的人。不避讳的讲,上面这种品质的后端开发,更容易成为某个产品线的负责人(不一定是leader),而测开由于职业的原因,很难做到。接着,测开的优点:1、钱多门槛相对较低。以我为例,有的offer甚至超过了当年大部分后端ssp的薪资,但是我个人的学历以及能力肯定是比不上后端ssp甚至sp的。2、压力相对较小,后端你不会的那是真的不会,测开可以堆时间弄明白。然后,测开的缺点:1、职业上限一般,拿美团职级举例说明:后端干到l9不说没希望,但还是有可能。测开干到l9真的很难。2、岗位相较于后端更少,而且是成本部门,如果业务线亏损,很可能首当其冲(这里就体现赚钱/核心部门的重要性,希望大家学生思维不要太重,为了薪资选择亏损、边缘部门,同理,核心部门的测开真不比边缘部门的开发差,不要想着被裁了随便找下家,我接触到的被裁的后端,真的很难找同等层次的下家)。最后,说点自己观察职场上面的一些感悟:1、校招进大厂绝对优于中小厂,很多工作七八年的社招,职级低,工资低,因为他们都是中小厂/二线城市跳过来的,校招生晋升、涨薪的速度和幅度不是中小公司来的社招能比的)2、工作久了就会发现,薪资才是王道,而不是简单的后端&gt;前端&gt;测试,大家都是出来赚钱的,谁比谁高贵,都是一起合作把活给干了。3、程序员就是赚快钱的工种,学会用钱生钱,才是实现财富自由的必经之路,打工是为了给自己赎身,而不是把自己变成头牌。
打工人的精神状态
点赞 评论 收藏
分享
01-02 09:43
门头沟学院 Java
告别&nbsp;996、告别单休续命、告别周末被工作侵占,真正能拥有两天完全属于自己的时间,睡个懒觉、约个朋友、充个电,才是打工的意义啊!作为常年混迹牛客的过来人,整理了一波大厂&nbsp;/&nbsp;名企的双休作息,各位求职&nbsp;er&nbsp;码住!互联网大厂篇(不卷的宝藏分支)腾讯(部分事业群)很多人以为腾讯全员卷,其实不少事业群(比如部分职能岗、非核心业务线)都是标准双休&nbsp;+&nbsp;弹性打卡,早&nbsp;10&nbsp;晚&nbsp;7&nbsp;的节奏,基本到点就能走,很少强制加班,周末安安静静没有工作消息轰炸。阿里(非核心电商线)别被&nbsp;“福报”&nbsp;吓到!阿里的飞猪、本地生活等部分业务线,执行的是双休&nbsp;+&nbsp;正常工时,加班频率远低于核心电商线,而且加班有明确的调休制度,不会让你白忙活。字节跳动(职能&nbsp;/&nbsp;中台岗)字节的&nbsp;“大小周”&nbsp;早就成为历史了!现在大部分岗位都是严格双休,技术中台、职能支持等岗位,基本能做到早&nbsp;10&nbsp;晚&nbsp;7,周末绝不打扰,主打一个高效工作、快乐生活。美团(部分非外卖业务线)外卖核心线确实忙,但像美团优选、企业服务等分支,都是双休&nbsp;+&nbsp;弹性工作制,加班不多,偶尔紧急项目加个班,也能快速调休补回来。科技&nbsp;/&nbsp;硬件大厂篇(作息稳定标杆)华为(非研发岗&nbsp;/&nbsp;部分研究所)研发岗可能节奏快,但职能岗、供应链、财经等部门,妥妥的双休&nbsp;+&nbsp;准时下班,而且华为的薪资福利和作息平衡做得很到位,适合想稳定发展的同学。大疆创新神仙公司实锤!标准双休&nbsp;+&nbsp;弹性打卡,工作氛围轻松,不提倡无效加班,到点办公室基本就空了,周末完全属于自己,而且福利待遇拉满,不愧是科技圈的&nbsp;“养老”&nbsp;好选择。小米(职能&nbsp;/&nbsp;市场岗)小米的双休制度执行得很彻底,尤其是职能、市场等岗位,早&nbsp;9&nbsp;晚&nbsp;6,周末绝不加班,偶尔遇到大促活动可能忙一点,但后续都会补休,不会压榨员工休息时间。外企&nbsp;/&nbsp;合资企业篇(双休天花板)微软中国外企的双休基因刻在骨子里!严格双休&nbsp;+&nbsp;带薪年假&nbsp;+&nbsp;弹性工作制,工作和生活的边界感极强,周末绝对不会有工作消息,加班更是稀有事件,简直是打工人的天堂。IBM&nbsp;中国老牌外企的作风,双休&nbsp;+&nbsp;不加班文化深入人心,工作节奏平缓,注重效率而非时长,到点就能拎包走人,周末安心享受自己的小日子。宝洁(快消大厂)快消圈的双休标杆!标准双休&nbsp;+&nbsp;朝九晚六,几乎没有加班,而且带薪假期超多,不仅能双休,还能攒假期出去旅游,幸福感直接拉满。最后唠两句其实现在越来越多大厂都在告别内卷,双休已经不是&nbsp;“稀有福利”,而是很多公司的标配!找工作&nbsp;/&nbsp;实习的时候,别只盯着薪资和&nbsp;title,作息制度真的太重要了!一个能让你拥有双休的公司,才能让你在工作之余,有精力提升自己、享受生活。
美团公司福利 3020人发布
点赞 评论 收藏
分享
评论
2
5
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务