【2025春招真题改编】03.07-饿了么春招-开发岗

✅ 春招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题(建议用时:90分钟/套)
  • 对照解析查漏补缺
  • 配套练习题库

互联网必备刷题宝典🔗

1️⃣:统计 01 串中 0 和 1 的个数,通过计算可能的交换方式确定不同字符串数量

2️⃣:使用模板匹配技术识别验证码图片中的"#"符号分布模式

3️⃣:构建字典树(Trie)优化异或查询,实现高效的数字黑板游戏

整体难度

这套题目整体难度适中,由简到难逐步递进:

  • 第一题是基础的计数问题,需要理解交换操作的特性
  • 第二题是模式识别问题,需要实现模板匹配
  • 第三题是高级数据结构应用,需要熟悉字典树和位运算

alt

01. 小基的拼图游戏

题目内容

小基是密码学研究中心的一名研究员,她正在研究一种新的字符串变换方法。她有一个由字符"0"和"1"组成的二进制字符串 。研究过程中,小基需要对这个字符串进行一次且仅一次的基本变换操作:

选择两个不同的位置 (其中 ),交换这两个位置上的字符

小基想知道,通过所有可能的一次变换操作,最多能生成多少个不同的字符串?

输入描述

一个仅由字符"0"和"1"构成的字符串

输出描述

一个整数,表示通过一次变换操作能生成的不同字符串的数量。

样例1

输入:

1100

输出:

5

题解

这道题目要求计算通过一次交换操作能得到多少个不同的字符串。

分析交换操作的特性:

  • 交换相同字符(两个 0 或两个 1):字符串保持不变。
  • 交换不同字符(一个 0 和一个 1):会得到一个新的字符串。

解题思路是统计字符串中 0 和 1 的个数,分别记为

可以选择的 0 和 1 的交换方式有 种,每种交换都会产生一个不同的字符串。

另外,如果存在至少两个相同字符(),交换这两个相同字符后,字符串保持不变,这种情况也应算作一种结果。

因此,答案是 (如果 ,则再加 1)。

算法的时间复杂度是 ,其中 是字符串的长度,主要用于统计 0 和 1 的个数。空间复杂度是 ,只需要常数级的额外空间。

对于题目给出的样例"1100",其中有 2 个 0 和 2 个 1,所以答案是

三语言参考代码

  • Cpp
#include <iostream>
#include <string>
using namespace std;

int main() {
    // 优化输入输出
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    string s;
    cin >> s;
    
    // 计数0和1的数量
    long long num0 = 0, num1 = 0;
    for (char ch : s) {
        if (ch == '0') num0++;
        else num1++;
    }
    
    // 计算结果
    long long res = num0 * num1;
    // 如果有至少两个相同字符,可以交换它们得到相同字符串
    if (num0 >= 2 || num1 >= 2) res++;
    
    cout << res << "\n";
    return 0;
}
  • Python
import sys
input = lambda:sys.stdin.readline().strip()

# 读取输入的01串
s = input()

# 统计0和1的个数
dig0 = s.count('0')
dig1 = s.count('1')

# 计算结果
ans = dig0 * dig1
# 如果有至少两个相同字符,交换后字符串不变,也算一种结果
if dig0 >= 2 or dig1 >= 2:
    ans += 1

# 输出结果
print(ans)
  • Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        
        // 读取输入的01串
        String s = scan.next();
        
        // 统计0和1的个数
        long zCnt = 0, oCnt = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '0') zCnt++;
            else oCnt++;
        }
        
        // 计算不同字符交换的结果数
        long res = zCnt * oCnt;
        
        // 如果存在至少两个相同字符,交换它们后字符串不变,也算一种结果
        if (zCnt >= 2 || oCnt >= 2) res++;
        
        // 输出结果
        System.out.println(res);
        scan.close();
    }
}

02. 小柯的智能验证系统

题目内容

小柯是一家科技公司的安全专家,为了解决日益严重的机器人自动注册问题,她设计了一种创新的图像验证码系统。

这个系统的核心思想是:在 5×5 的网格中同时放置特殊符号"#"和数字(0-9)。真正的验证码信息隐藏在"#"符号的分布模式中,而数字只是用来干扰机器人识别。

每个数字(0-9)在 5×5 网格中都有唯一的"#"符号排列模式:

例如数字 5 的模式如下:

#...#
#.###
#...#
###.#
#...#

系统可能在非"#"的位置随机填入 0-9 的数字,但这些数字对于验证码的正确识别没有意义,例如:

#222#
#2###
#232#
###2#
#272#

这张图片中的"#"符号排列模式正好代表数字 5。

现在,小柯向你提供了 张验证码图片,请你识别出每张图片代表的真实数字,并按顺序输出这些数字组成的验证码。

输入描述

第一行一个整数 ),表示验证码图片的数量。

接下来 行,每 5 行描述一张 5×5 的验证码图片。图片中只包含字符"#"和数字 0-9。

输出描述

一个整数,表示所有验证码图片按顺序识别出的数字组成的结果。

样例1

输入:

1
#222#
#2###
#232#
###2#
#272#

输出:

5

样例2

输入:

2
#222#
#2###
#232#
###2#
#272#
##1##
##1##
##1##
##1##
##1##

输出:

51

题解

这道题目的核心是模式识别问题。需要识别 5×5 网格中"#"符号的分布模式,忽略其中的数字干扰,从而判断每张图片代表的实际数字。

首先,定义每个数字 0-9 对应的"#"符号模式。这些模式可以硬编码在程序中,作为识别的基准。每个数字都有唯一的 5×5 模式,比如数字 5 的模式如题目所示。

解题步骤:

  1. 初始化模板:定义 0-9 十个数字的"#"符号分布模式。每个模式是一个 5×5 的网格,其中"#"表示该位置应该有特殊符号,"."表示该位置可以是任何数字或空白。

  2. 读取输入:读取 及接下来的 行图片数据,每 5 行构成一张图片。

  3. 预处理图片:对每张图片进行预处理,将所有数字字符替换为".",保留"#"符号。这样处理后的图片就只包含模式信息。

  4. 模式匹配:将处理后的图片与预定义的 10 个数字模板进行比对。如果某个模板与图片完全匹配,那么这张图片就代表对应的数字。

  5. 组合结果:按顺序将识别出的数字组合起来,得到最终的验证码。

处理 张图片,每张图片需要与 10 个模板进行比对,每次比对需要检查 5×5=25 个位置,因此总的时间复杂度是 。对于 的数据范围来说,这个复杂度是完全可接受的。

难点在于正确定义各个数字的模板,以及准确地进行模式匹配。

三语言参考代码

  • Cpp
#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
    // 优化输入输出
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int m;
    cin >> m;  // 读入图片数量
    
    // 定义0-9各数字对应的模板
    vector<vector<string>> mods(10, vector<string>(5));
    
    // 初始化各数字模板
    mods[0] = {
        "#...#",
        "#.#.#",
        "#.#.#",
        "#.#.#",
        "#...#"
    };
    mods[1] = {
        "##.##",
        "##.##",
        "##.##",
        "##.##",
        "##.##"
    };
    mods[2] = {
        "#...#",
        "###.#",
        "#...#",
        "#.###",
        "#...#"
    };
    mods[3] = {
        "#...#",
        "###.#",
        "#...#",
        "###.#",
        "#...#"
    };
    mods[4] = {
        "#.#.#",
        "#.#.#",
        "#...#",
        "###.#",
        "###.#"
    };
    mods[5] = {
        "#...#",
        "#.###",
        "#...#",
        "###.#",
        "#...#"
    };
    mods[6] = {
        "#...#",
        "#.###",
        "#...#",
        "#.#.#",
        "#...#"
    };
    mods[7] = {
        "#...#",
        "###.#",
        "###.#",
        "###.#",
        "###.#"
    };
    mods[8] = {
        "#...#",
        "#.#.#",
        "#...#",
        "#.#.#",
        "#...#"
    };
    mods[9] = {
        "#...#",
        "#.#.#",
        "#...#",
        "###.#",
        "#...#"
    };
    
    // 读取所有图片
    vector<vector<string>> pics(m, vector<string>(5));
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < 5; j++) {
            cin >> pics[i][j];
        }
    }
    
    string res;
    res.reserve(m);
    
    // 处理每张图片
    for (int i = 0; i < m; i++) {
        // 将数字替换为'.'
        vector<string> image = pics[i];
        for (int r = 0; r < 5; r++) {
            for (int c = 0; c < 5; c++) {
                if (isdigit(image[r][c])) {
                    image[r][c] = '.';
                }
            }
        }
        
        // 与模板匹配
        int digit = -1;
        for (int d = 0; d < 10; d++) {
            bool same = true;
            for (int r = 0; r < 5; r++) {
                if (image[r] != mods[d][r]) {
                    same = false;
                    break;
                }
            }
            if (same) {
                digit = d;
                break;
            }
        }
        
        // 添加识别结果
        res.push_back('0' + digit);
    }
    
    // 输出结果
    cout << res << "\n";
    return 0;
}
  • Python
import sys
input = lambda:sys.stdin.readline().strip()

def main():
    # 读入图片数量
    m = int(input())
    
    # 定义0-9各数字对应的模板
    # 其中'#'表示特殊符号,'.'表示可以是任何数字
    tpl_list = [
        [  # 数字0的模板
            "#...#",
            "#.#.#",
            "#.#.#",
            "#.#.#",
            "#...#"
        ],
        [  # 数字1的模板
            "##.##",
            "##.##",
            "##.##",
            "##.##",
            "##.##"
        ],
        [  # 数字2的模板
            "#...#",
            "###.#",
            "#...#",
            "#.###",
            "#...#"
        ],
        [  # 数字3的模板
            "#...#",
            "###.#",
            "#...#",
            "###.#",
            "#...#"
        ],
        [  # 数字4的模板
            "#.#.#",
            "#.#.#",
            "#...#",
            "###.#",
            "###.#"
        ],
        [  # 数字5的模板
            "#...#",
            "#.###",
            "#...#",
            "###.#",
            "#...#"
        ],
        [  # 数字6的模板
            "#...#",
            "#.###",
            "#...#",
            "#.#.#",
            "#...#"
        ],
        [  # 数字7的模板
            "#...#",
            "###.#",
            "###.#",
            "###.#",
            "###.#"
        ],
        [  # 数字8的模板
            "#...#",
            "#.#.#",
            "#...#",
            "#.#.#",
            "#...#"
        ],
        [  # 数字9的模板
            "#...#",
            "#.#.#",
            "#...#",
            "###.#",
            "#...#"
        ]

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

互联网刷题笔试宝典 文章被收录于专栏

互联网刷题笔试宝典,这里涵盖了市面上大部分的笔试题合集,希望助大家春秋招一臂之力

全部评论

相关推荐

总结:面了一个小时,前半段问项目,后半段问八股,两道编程题。面试官很热情,介绍了半天他们的业务,像是在汇报哈哈哈哈。八股部分1.单例模式有用过吗,怎么实现的(不知道怎么实现)回答:用得比较多的地方是数据库连接池,全局只能有一个连接池,并且提供全局访问。以下是搜索结果:有五种经典的实现方式。第一种是饿汉式(线程安全)他在类加载的时候就立即初始化实例,使用场景是实例占用资源少,且频繁使用。第二种是懒汉式(非线程安全)延迟初始化,在使用的时候,如果没有这个实例才初始化,在多线程环境下会创建多个实例。第三种是线程安全懒汉式,通过synchronized保证线程安全,但性能差。(因为锁的粒度很粗)不建议高频调用。第四种是双重检查锁(DCL)。特点是延迟初始化,并且线程安全第五种是静态内部类(推荐)。特点是利用类加载机制保证线程安全,延迟初始化且无锁。2.JVM运行时数据区回答:有堆,栈,方法区。堆存储对象实例,数组;栈存储线程的调用栈帧;方法去存储对象信息和方法信息。3.事务ACID了解吗回答:原子性,持久性,一致性,隔离性。1.原子性由undolog实现2.隔离性由锁或者MVCC实现(吟唱一下隔离性的四个级别)3.持久性由redolog实现4.一致性由前三者一起保证实现。场景业务题1.在一个发优惠券的场景,我有一个10w行的用户数据表,要取出里面的用户信息放入模型中,返回优惠券的结果,(模拟用户领券的过程)。我需要做的是,验证这些数据是否满足一定的断言(例如面额超过50块,补贴力度过大)。由于一台机器的内存不足以存放这些数据,你有四台机器,请你设计一个批量请求的工具,以分布式的方式去跑这些数据,你会做那些设计?回答:我也没听太懂这些问题。以下是搜索结果。我将设计一个分布式批量处理工具来解决发券场景中的大数据验证问题,核心目标是实现高效分片处理、动态负载均衡、分布式断言校验和结果聚合。以下是详细设计方案:整体架构设计核心组件设计1.分布式协调器(Coordinator)部署在Master节点,负责全局调度2.工作节点(Worker)部署在4台工作机器,负责实际处理3.断言验证引擎该设计可实现10w用户数据的分布式处理,核心优势:1.&nbsp;横向扩展&nbsp;:通过增加Worker节点可线性提升处理能力2.&nbsp;故障容忍&nbsp;:自动重试和检查点机制保证可靠性3.&nbsp;资源优化&nbsp;:流式处理避免内存溢出4.&nbsp;实时监控&nbsp;:全过程可视化跟踪2.饿了么的搜索功能,请你针对这个搜索功能写一些功能点。比如输入奶茶关键词,返回一些结果。回答:我只回答了搜索框不能为空,对返回结果进行排序等等。以下是搜索结果。1.搜索前引导功能a.热词推荐i.功能描述:搜索框下方动态展示当前商圈热门关键词(如奶茶,果茶)ii.奶茶示例:用户点击奶茶热词,直接跳转到相关商品列表页b.历史搜索i.功能描述&nbsp;:根据用户过往搜索记录(如“芋泥奶茶”)生成个性化推荐。ii.数据支撑&nbsp;:历史搜索订单转化率仅次于商家直达c.场景化引导i.功能描述​:分时段(早餐/下午茶)推送关联词(如下午茶时段优先显示“奶茶+甜品”组合)。d.语音/图像搜索i.​功能描述​:支持语音输入“奶茶”或拍摄奶茶图片触发搜索,系统自动转文字并匹配商品。2.关键词处理功能a.​智能纠错与联想​i.功能描述​:自动纠正拼写错误(如“奶车→奶茶”),并联想高频词(如“奶茶→珍珠奶茶”“芝士奶盖”)。ii.技术实现​:基于搜索日志构建纠错词库与拼音转换模型b.​同义词与品类扩展​i.​功能描述​:搜索“奶茶”时同步召回“果茶”“乳茶”等同品类商品。c.​意图识别​d.​功能描述​:i.若用户多次搜索“低卡奶茶”,优先展示低糖商品;ii.若搜索“奶茶+外卖速度”,则突出配送时效快的商家。3.搜索结果展示功能a.​多维度排序​i.​排序逻辑​:综合销量(70%)、评分(20%)、配送速度(10%)等权重生成列表。ii.​奶茶示例​:高销量“喜茶”排列在低销量小众品牌前。b.​分层筛选器​i.​筛选条件​:ii.价格区间(如“10-20元”);iii.口味(“芋泥”“黑糖”);iv.商家服务(“免配送费”“会员折扣”)。c.​商家直达与商品级搜索​i.​功能描述​:ii.输入“奈雪の茶”直接进入店铺页;iii.搜索“霸气葡萄”显示该单品而非全店商品。d.​商业化融合​i.​功能描述​:在结果页插入“奶茶排行榜”或限时优惠活动(如“第二杯半价”)。4.搜索后优化功能a.​个性化结果缓存​i.​功能描述​:用户多次搜索“奶茶”后,首页历史搜索栏固定显示该关键词。b.​搜索分析看板​c.​后台功能​:统计“奶茶”搜索量、点击率、转化率,指导商家优化菜品命名(如将“红茶拿铁”改为“鸳鸯奶茶”)。3.测试人员除了写测试用例之外,还要做那些事情?1.会参与需求的分析与测试策略制定a.&nbsp;参与需求评审会议,分析需求的可测试性b.&nbsp;指定测试计划2.测试设计和用例开发a.测试场景建模b.测试用例编写3.测试执行与缺陷管理a.分层测试实施(单元,集成,系统测试)b.缺陷全生命周期管理4.质量评估与报告输出a.质量指标分析b.测试报告编制5.自动化测试实施a.接口自动化b.UI自动化6.跨团队协作a.开发写作b.产品沟通7.测试过程改进8.技术研究与创新笔试题1.SQL题目:用sql找出不同课程的成绩的第二名和第三名WITH&nbsp;RankedScores&nbsp;AS&nbsp;(SELECTstudent_id,course_id,score,RANK()&nbsp;OVER&nbsp;(PARTITION&nbsp;BY&nbsp;course_id&nbsp;ORDER&nbsp;BY&nbsp;score&nbsp;DESC)&nbsp;AS&nbsp;rankFROM&nbsp;scores)SELECTcourse_id,student_id,score,rankFROM&nbsp;RankedScoresWHERE&nbsp;rank&nbsp;IN&nbsp;(2,&nbsp;3)ORDER&nbsp;BY&nbsp;course_id,&nbsp;rank;2.LeetCode梦的开始:两数之和反问环节1.你们的业务内容回答:主要负责搜索功能和营销功能,搜索就是饿了么的搜索框部分,营销主要负责爆红包等等。日常还要做一些系统的压力测试,以及与其他团队一起做集成测试。年度还会做测试平台开发,质量和效率提升的OKR。2.工作节奏回答:9点半上班,周一到周四可能下班晚一点,周五正常6点下班,周末双休。3.开发技术栈回答:主要是Java
查看11道真题和解析
点赞 评论 收藏
分享
05-26 16:18
门头沟学院 Java
从4月1号的第一次面试到5月13号的滴滴二面,暑期实习也是终于画上句号了。从3月初就开始投&nbsp;,投了几十个公司,有笔试有面试的一共有20多个公司。timeline大概如下:3.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;米哈游笔试挂3.16&nbsp;&nbsp;&nbsp;&nbsp;快手简历挂3.27&nbsp;&nbsp;&nbsp;&nbsp;蚂蚁笔试后挂3.28&nbsp;&nbsp;&nbsp;&nbsp;饿了么笔试后挂4.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;美团一面挂4.2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;京东一面过4.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;京东二面挂,15分钟结束,kpi4.9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;美团捞了一次,可惜没撕出来,又挂4.23&nbsp;&nbsp;&nbsp;&nbsp;腾讯wxg一面秒挂,太菜了5.7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;华为技术面和hr面通过,泡池子中5.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;滴滴一面5.13&nbsp;&nbsp;&nbsp;&nbsp;滴滴二面5.23&nbsp;&nbsp;&nbsp;&nbsp;滴滴口头oc5.26&nbsp;&nbsp;&nbsp;&nbsp;滴滴offer滴滴一面面经1.介绍一下你的项目2.介绍一下短信登录具体是怎么优化的,redis的key和value都是什么3.在更新策略中,为什么采用先操作数据库再删除缓存的策略,为什么不用先删除缓存再操作数据库的策略?先操作数据库再删除缓存的策略是否有问题,应该如何解决?4.如何在不用reentrantlock锁的情况下,用redis分布式锁实现可重入锁?key和value都是什么?5.在优惠券的一人一单模块中,key和value都是什么6.项目中是如何用乐观锁解决缓存超卖的?考虑一个场景,如果一个商户要从供货商进货,还要进行售货,详细说一下用乐观锁的流程?7.现在有一个100层的楼,现在如果想用两个球测试,球从哪一层开始扔会碎,在这一层以上扔的话,球都会碎,在这层往下扔,球不会碎。请问最少需要扔多少次?8.手撕题:打印金字塔9.手撕题:数组中的第k个最大值元素滴滴二面总结1.在项目中,GEO具体是怎么使用的?商户和商户之间计算距离的具体算法是什么?如果多个人都进行附近商户查询时,会不会出现性能问题?2.feed流的推模式和拉模式?一般情况下,拉模式用的比较多,为什么你采用推模式呢?是否注意过朋友圈和微博消息推送时,技术实现的区别?3.在java集合中,有哪些线程安全的集合?你提到了threadlocal,threadlocal具体是做什么的,原理?有哪些问题?你提到了内存泄漏,内存泄漏有时只是几个变量的大小,不会造成多大空间的泄露,还有其他的问题吗?4.JVM的内存模型?5.mysql的事务的隔离级别?6.MySQL的索引有哪些?说一下B树和B+树的原理?B+树在插入节点时,会出现哪些树形结构的变化?7.线程池的参数有哪些?你在项目中是否用到了线程池?在真正使用中,如何选取线程池的参数?如果在一个I/O密集型系统中,如果让核心线程数直接等于CPU核数x2是否不合适,考虑一个场景:如果一个系统需要qps=10000,系统的请求处理时间为100ms,那么核心线程数该怎么设置?8.手撕:在100000个数据中,找到最大的10个数据,topk问题。中间也自闭焦虑过,最后感谢滴滴收留了我,大桔大利。
查看17道真题和解析
点赞 评论 收藏
分享
05-30 19:03
门头沟学院 Java
4.17投的简历4.30约我一面5.8一面Redis实现Session共享的延伸:如果用的是本地缓存,如何实现数据一致性?会有什么问题?Redis的RDB持久化和AOF持久化Mysql什么能保证数据崩溃重启不丢失?Mysql的binlog日志Redis的Cache&nbsp;Aside&nbsp;Pattern和Read/Write&nbsp;Through&nbsp;Pattern缓存穿透的解决如何实现视频的点赞取消,判断用户是否点赞,点赞的次数(Redis)如果不使用设计模式是否可以?设计模式是为了干嘛的?TCP四次挥手(如果存在用命令查到,系统中存在大量Close&nbsp;wait状态,是因为什么?)双亲委派模型(大体上是这些,其他的有些忘了)是否有offer了?反问:有什么可以改进的地方?接下来还有几轮面试?代码题:在保证线程并发安全的情况下,并发读取多个文件的字符串,并且合并统计出现次数,确保5秒的超时时间。面试官人很好,会一直提示你,并且出的题都是根据场景来的,我最后代码题,有一点点没写出来的代码,面试官也帮我点出来了。也是经过两周hr给我打电话说部门没hc了,意料之内,情理之中复活换了个部门进行二面,5.23二面,一共1小时15分钟左右二面全程拷打项目,我写的是点评加12306,不过本人写了两段大数据开发的实习经历(没问)面试官问,我一边回想一边说自己做了什么项目改进3天后告知2面通过,约了5.29进行3面5.29三面发现是TL和HR一起面的,TL拷打我项目几个问题,&nbsp;我记得最深刻的一个是我用lua脚本代替分布式锁来进行抢单,lua脚本好在哪里?没回答中点,擦边回答了,最抽象的是hr换岗之后没跟我说部门是哪里的(不是三面的hr),然后他问我知道公司在哪里么,我回答了一堆意向杭州的话,听到他们说北京的时候有点红温了,赶紧圆了一下。反问:培养方案是否有机会转正进去负责的业务5.30&nbsp;oc,感觉几个月以来的付出都有了回报,这几个月都看着大佬们的oc非常羡慕,终于自己也等来了收获,来此还愿,积攒人品,我希望大家在周围人都oc,坚持不下去的时候都咬牙坚持下来,别放弃自己,越痛苦沉重的时候,越要学习,机会来临的时候,很可能只有这一次,请把握住!
查看17道真题和解析
点赞 评论 收藏
分享
评论
1
3
分享

创作者周榜

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