【备战秋招】2024届京东秋招笔试真题改编01

✅ 秋招备战指南 ✅

💡 学习建议:

  • 先尝试独立解题
  • 对照解析查漏补缺

🧸 题面描述背景等均已深度改编,做法和题目本质基本保持一致。

🍹 感谢各位朋友们的订阅,你们的支持是我们创作的最大动力

🌸 目前本专栏已经上线90+套真题改编解析,后续会持续更新的

春秋招笔试机考招合集 -> 互联网必备刷题宝典🔗

01. 小柯的魔法面料

问题描述

小柯是一名服装设计师,她最近发现了一种神奇的面料。这种面料由 的网格组成,每个格子上有三种可能的图案:圆点(.)、星星(*)和爱心(o)。

这种面料的图案会不断变化,同时面料的整体颜色也会随之改变。经过长时间的观察,小柯发现了以下规律:

  • 如果面料上只出现 o*o 的图案组合,那么面料会变成蓝色。
  • 如果面料上只出现 *o* 的图案组合,那么面料会变成红色。
  • 如果面料上同时出现 o*o*o* 的图案组合,或者两者都不出现,那么面料会保持白色。

现在,小柯想请你帮忙判断,给定一种面料的图案,它的颜色会是什么。

输入格式

第一行包含一个正整数 ,表示询问的次数。

接下来对于每组询问,输入三行,每行包含一个长度为 的字符串,表示面料的图案。字符串只包含字符 '.''*''o'

输出格式

对于每组询问,输出一行,表示面料的颜色:

  • 如果面料是蓝色,输出 yukari
  • 如果面料是红色,输出 kou
  • 如果面料是白色,输出 draw

样例输入

3
...
o*o
...
...
*o*
...
o..
*..
o..

样例输出

yukari
kou
yukari
样例 解释说明
样例1 面料中出现了 o*o 的图案组合(第二行),但没有出现 *o* 的组合,所以面料是蓝色,输出 yukari
样例2 面料中出现了 *o* 的图案组合(第二行),但没有出现 o*o 的组合,所以面料是红色,输出 kou
样例3 面料中,第一列构成了 o*o 的图案组合,没有出现 *o* 的组合,所以面料是蓝色,输出 yukari

数据范围

题解

这道题目主要考察字符串处理和模式识别。我们需要在给定的 网格中,检查是否存在特定的图案组合。

关键思路是:

  1. 我们需要检查每一行和每一列是否出现了 o*o*o* 的图案组合。
  2. 根据题目规则,如果只出现 o*o,面料是蓝色;如果只出现 *o*,面料是红色;如果两者都出现或都不出现,面料是白色。

实现步骤:

  1. 首先读取询问次数
  2. 对于每个询问,读取 网格的图案。
  3. 检查每一行是否出现了 o*o*o* 的图案组合。
  4. 检查每一列是否出现了 o*o*o* 的图案组合。
  5. 根据检查结果,判断面料的颜色并输出。

这种方法的时间复杂度是 ,因为对于每个询问,我们只需要常数时间来检查网格中的图案。空间复杂度也是 ,因为我们只需要存储固定大小的网格和一些辅助变量。

参考代码

  • Python
import sys
input = lambda: sys.stdin.readline().strip()

def solve():
    # 读取询问次数
    t = int(input())
    
    for _ in range(t):
        # 读取面料图案
        grid = [input() for _ in range(3)]
        
        # 检查是否存在特定组合
        has_blue = False
        has_red = False
        
        # 检查每一行
        for row in grid:
            if row == "o*o":
                has_blue = True
            if row == "*o*":
                has_red = True
                
        # 检查每一列
        for j in range(3):
            col = grid[0][j] + grid[1][j] + grid[2][j]
            if col == "o*o":
                has_blue = True
            if col == "*o*":
                has_red = True
        
        # 判断颜色
        if has_blue and not has_red:
            print("yukari")
        elif has_red and not has_blue:
            print("kou")
        else:
            print("draw")

if __name__ == "__main__":
    solve()
  • Cpp
#include 
#include 
#include 
using namespace std;

void solve() {
    int t;
    cin >> t;
    
    while (t--) {
        // 读取面料图案
        vector grid(3);
        for (int i = 0; i < 3; i++) {
            cin >> grid[i];
        }
        
        bool has_blue = false, has_red = false;
        
        // 检查每一行
        for (int i = 0; i < 3; i++) {
            if (grid[i] == "o*o") has_blue = true;
            if (grid[i] == "*o*") has_red = true;
        }
        
        // 检查每一列
        for (int j = 0; j < 3; j++) {
            string col = "";
            col += grid[0][j];
            col += grid[1][j];
            col += grid[2][j];
            
            if (col == "o*o") has_blue = true;
            if (col == "*o*") has_red = true;
        }
        
        // 判断颜色
        if (has_blue && !has_red) {
            cout << "yukari" << endl;
        } else if (has_red && !has_blue) {
            cout << "kou" << endl;
        } else {
            cout << "draw" << endl;
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
    return 0;
}
  • Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        sc.nextLine(); // 读取换行符
        
        for (int tc = 0; tc < t; tc++) {
            String[] grid = new String[3];
            for (int i = 0; i < 3; i++) {
                grid[i] = sc.nextLine();
            }
            
            boolean hasBlue = false, hasRed = false;
            
            // 检查每一行
            for (int i = 0; i < 3; i++) {
                if (grid[i].equals("o*o")) hasBlue = true;
                if (grid[i].equals("*o*")) hasRed = true;
            }
            
            // 检查每一列
            for (int j = 0; j < 3; j++) {
                String col = "" + grid[0].charAt(j) + grid[1].charAt(j) + grid[2].charAt(j);
                if (col.equals("o*o")) hasBlue = true;
                if (col.equals("*o*")) hasRed = true;
            }
            
            // 判断颜色
            if (hasBlue && !hasRed) {
                System.out.println("yukari");
            } else if (hasRed && !hasBlue) {
                System.out.println("kou");
            } else {
                System.out.println("draw");
            }
        }
        
        sc.close();
    }
}

02. 小基 的字符串重构

问题描述

小基 是一位勤奋的程序员,她决定对自己以前写的程序进行 debug。

小基 有一个待修复的 bug 列表,用二进制字符串表示。其中第 位为 表示该 bug 已经修复,为 表示该 bug 尚未修复。

小基 有 个修复工具,每个工具能修复的 bug 也用二进制字符串表示。其中第 位为 表示该工具能够修复该 bug,为 表示该工具不能修复该 bug。但是每个工具都有一些副作用,它们会引入新的 bug。工具引入 bug 的情况也用二进制字符串表示,其中第 位为 表示该工具在修复后会引入该 bug。

现在,小基 告诉你她使用工具的顺序,她想知道每使用一个工具后,还会剩下多少个未修复的 bug。

输入格式

第一行输入一个正整数 ,表示 bug 列表的长度。

第二行输入一个长度为 的二进制字符串,表示初始的 bug 列表。

第三行输入一个正整数 ,表示工具的数量。

接下来的 行,每 行描述一个工具:

  • 第一行输入一个长度为 的二进制字符串,表示该工具能够修复的 bug。
  • 第二行输入一个长度为 的二进制字符串,表示该工具会引入的 bug。

接下来一行,输入一个正整数 ,表示 小基 使用工具的次数。

最后 行,每行输入一个正整数 ,表示 小基 使用了第 个工具。

输出格式

输出 行,每行一个整数,表示使用相应工具后剩余的 bug 数量。

样例输入

4
1101
2
1010
0001
1001
0100
2
2
1

样例输出

1
2
样例 解释说明
输入解析 bug列表长度为4,初始bug列表为"1101"(3个bug)。有2个工具,第一个工具能修复"1010"对应的bug,会引入"0001"对应的bug;第二个工具能修复"1001"对应的bug,会引入"0100"对应的bug。小基先使用工具2,再使用工具1。
使用工具2后 初始bug列表为"1101"。工具2能修复的bug为"1001",修复后变为"0100"。工具2引入的bug为"0100",最终bug列表为"0100",共1个bug。
使用工具1后 当前bug列表为"0100"。工具1能修复的bug为"1010",修复后bug列表仍为"0100"。工具1引入的bug为"0001",最终bug列表为"0101",共2个bug。

数据范围

保证每个工具能够修复的 bug 和引入的 bug 都不会重复。

题解

这道题目的核心在于理解二进制字符串如何表示bug的状态,以及如何模拟工具修复和引入bug的过程。

首先,我们需要明确几个概念:

  1. bug列表是一个二进制字符串,1表示未修复,0表示已修复
  2. 工具的修复能力也是一个二进制字符串,1表示能修复,0表示不能修复
  3. 工具的副作用也是一个二进制字符串,1表示会引入新bug,0表示不会引入

解题思路如下:

  1. 将二进制字符串转换为整数,以便进行位运算
  2. 当使用工具修复bug时,如果工具能修复某位置的bug(工具对应位为1),且当前存在该bug(列表对应位为1),则将该位置为0(表示修复)
  3. 当引入新bug时,如果工具会引入某位置的bug(副作用对应位为1),则将该位置为1(表示有bug)
  4. 每次操作后,统计当前bug列表中1的个数,即为未修复的bug数量

用位运算表达就是:

  • 修复bug:bug_list = bug_list & ~(tool_fix & bug_list),即先找出能被修复的bug,然后从bug列表中去掉
  • 引入bug:bug_list = bug_list | tool_introduce,即将新bug添加到列表中

这种方法时间复杂度为O(t),其中t是操作次数。每次操作都是O(1)的位运算,非常高效。空间复杂度为O(m),用于存储工具信息。

参考代码

  • Python
import sys
input = lambda: sys.stdin.readline().strip()

def count_bits(num):
    """计算一个整数的二进制表示中1的个数"""
    count = 0
    while num > 0:
        count += num & 1
        num >>= 1
    return count

def solve():
    n = int(input())  # bug列表长度
    
    # 将二进制字符串转换为整数
    bug_list = int(input(), 2)
    
    m = int(input())  # 工具数量
    tools = []
    
    # 读取每个工具的信息
    for _ in range(m):
        fix = int(input(), 2) 

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

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

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

全部评论

相关推荐

07-16 23:12
真实工作体验~先说结论:非常安利!!!&nbsp;在滴滴成长很快,对新人有培养体系。老板们和同事都很职业,能力强,培养了我比较好的职业习惯,也拿到了比较好的结果。当然有时候压力也会大一点点,挺过去就好了。&nbsp;上下班不打卡,包晚餐,9点后打车免费。有商保报销90%,过节有公司礼盒。有人情味,相较其他厂老人(3年以上司龄)相对更多些!⭐关于职场氛围:真的很爱滴滴🍊的氛围,大家都很亲近,组里人也会一起吃饭,而且经常被请客,嘻嘻。还有就是可能职场不是很大,整个二楼一半人我都认识了!我从最开始比较害羞到慢慢主动和别人搭话噜,感觉这次实习认识的小伙伴还是比较多的!&nbsp;⭐关于成长:mt和同事不管在日常工作上还是求职、职业规划上都给我提供了帮助,花时间辅导我面试、回答我幼稚的问题…这些都让我很感激!而且我也看到了他们的工作状态,对商分、数分有了一些理解。有时候和他们的交流给迷茫时期的我带来了一些慰藉。不过有时候组里忙起来可能就没人管我,所以我也狠狠摸鱼了&nbsp;⭐通勤不太方便是真的,上海职场离地铁站老远了,而且地理位置离上海哪个高校都远;晚上的饭菜也不是很好吃;茶水间只有开水……&nbsp;但是工位不挤,实习生独立工位这点还是蛮好嘟;而且楼下有健身房,有时间可以去跑个步哦~&nbsp;⭐很爱Mac&nbsp;book前置拍出来糊糊的感觉!宝子们可以试一下hhh,摸鱼不干别的就是自拍、养花、吃零食滴滴2026届秋招储备实习生招聘正式启动啦!🚘岗位类别工程/算法/数据/安全技术/效能管理/产品/商业分析/金融模型/运营/专业职能/其他🚘投递要求2025年9月~2026年8月之间毕业的海内外高校毕业生,每人可投递1个岗位🚘工作地点北京/杭州/上海等🚘招聘流程简历投递(7.11起)-面试安排-Offer发放🚘【内推链接】https://app.mokahr.com/campus-recruitment/didiglobal/96064?recommendCode=DScKP9qC#/jobs【内推码】DScKP9qC立刻投递,快人一步,抢跑未来立刻投递,快人一步,抢跑未来!大家投递完可以在评论区打上姓名缩写+岗位(比如PM+LJJ),我来确认有没有内推成功喽
滴滴公司福利 1105人发布
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

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