淘天笔试 淘天笔试题 0517

笔试时间:2025年5月17日

第一题

小苯有一个长度为n的01串x(下标从1到n),格格有一个长度恰好为n - 1的01串y(下标从1到n - 1)。格格的字符串y是用来匹配小苯的字符串x的,具体规则如下: 如果yi = 1(1 ≤ i ≤ n - 1),则意味着必须有:xi ≠ xi+1。 如果yi = 0(1 ≤ i ≤ n - 1),则意味着必须有:xi = xi+1。而现在小苯的串x并不一定满足y串的匹配要求,格格希望小苯修改尽可能少的字符,使得匹配成立。修改操作:选择i(1 ≤ i ≤ n),执行:xi = xi ⊕ 1(其中⊕ 表示按位异或运算 )。请你帮小苯算一算至少需要修改多少个字符。

输入描述

每个测试文件均包含多组测试数据。第一行输入一个整数T(1 ≤ T ≤ 100)代表数据组数,每组测试数据描述如下: 第一行输入一个正整数n(2 ≤ n ≤ 10^9)代表x串的长度。 第二行输入一个长度为n,仅由字符‘0’和‘1’构成的字符串x。 第三行输入一个长度为n - 1,仅由字符‘0’和‘1’构成的字符串y。 除此之外,保证单个测试文件的n之和不超过10^9。

输出描述

对于每组测试数据,在单独的一行输出一个整数,表示最少的修改次数。

样例输入

2

8

11001011

1000111

6

101010

11111

样例输出

4

0

解释:对于第一组测试数据,我们修改x串为: "10000101" 即可,需要至少4次修改操作。 对于第二组测试数据,我们不需要修改x,因此输出0即可。

参考题解

枚举 x′[1] 为 0 或 1 两种可能,根据 y 串的异或关系递推唯一确定整个 x′,分别计算与原串 x 的翻转代价,取最小值即为答案。

C++:

// C++ 版本
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;
    while (T--) {
        int n;
        string x, y;
        cin >> n >> x >> y;

        long long cost0 = 0, cost1 = 0;
        int prev0 = 0, prev1 = 1;

        // 处理第一个字符
        if (x[0] != '0') cost0++;
        if (x[0] != '1') cost1++;

        // 逐位计算
        for (int i = 1; i < n; i++) {
            int yi = y[i-1] - '0';
            int curr0 = prev0 ^ yi;
            int curr1 = prev1 ^ yi;
            if (x[i] != char('0' + curr0)) cost0++;
            if (x[i] != char('0' + curr1)) cost1++;
            prev0 = curr0;
            prev1 = curr1;
        }

        cout << min(cost0, cost1) << '\n';
    }
    return 0;
}

Java:

// Java 版本
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine().trim());
        while (T-- > 0) {
            int n = Integer.parseInt(br.readLine().trim());
            String x = br.readLine().trim();
            String y = br.readLine().trim();

            long cost0 = 0, cost1 = 0;
            int prev0 = 0, prev1 = 1;

            // 处理第一个字符
            if (x.charAt(0) != '0') cost0++;
            if (x.charAt(0) != '1') cost1++;

            // 逐位计算
            for (int i = 1; i < n; i++) {
                int yi = y.charAt(i - 1) - '0';
                int curr0 = prev0 ^ yi;
                int curr1 = prev1 ^ yi;
                if (x.charAt(i) != ('0' + curr0)) cost0++;
                if (x.charAt(i) != ('0' + curr1)) cost1++;
                prev0 = curr0;
                prev1 = curr1;
            }

            System.out.println(Math.min(cost0, cost1));
        }
    }
}

Python:

import sys
import threading

def main():
    input = sys.stdin.readline
    t = int(input())
    for _ in range(t):
        n = int(input())
        x = input().strip()
        y = input().strip()
        cost0 = 0
        cost1 = 0
        prev0 = 0
        prev1 = 1
        if x[0] != '0': cost0 += 1
        if x[0] != '1': cost1 += 1
        for i in range(1, n):
            yi = int(y[i-1])
            curr0 = prev0 ^ yi
            curr1 = prev1 ^ yi
            if x[i] != str(curr0): cost0 += 1
            if x[i] != str(curr1): cost1 += 1
            prev0 = curr0
            prev1 = curr1
        print(min(cost0, cost1))

if __name__ == "__main__":
    threading.Thread(target=main).start()

第二题

小红现在有每种小写字母若干个,她想把这些字母组成一个字符串s,使得字符串s任意两个相邻字母都不一样, 请你帮助她求出最长字符串的长度。

输入描述

每个测试文件均包含多组测试数据。第一行输入一个整数T(1 ≤ T ≤ 1000)代表数据组数,每组测试数据描述如下: 对于每一组测试数据,每行26个整数,依次表示a - z的字母数量xi(0 ≤ xi ≤ 10^9)。

输出描述

每组数据输出一个整数,表示满足条件的最长字符串的长度。

样例输入

3

00000000000000000000000011

00000000000000000000000111

11111111111111111111111115

样例输出

2

3

30

参考题解

先统计所有字母的总数 total 和出现次数最多的字母数 mx; 如果 mx 不超过剩下字母数加一(也就是 mx ≤ total - mx + 1),说明可以把所有字母都两两不同地插排进去,最长长度就是 total; 否则说明最常见的字母太多,只能在其他字母间插入,最长长度就是把这些“多余”部分两两交替:2*(total - mx) + 1。

C++:

// C++ 版本
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    string line;
    if (!getline(cin, line)) return 0;
    int t = stoi(line);
    for (int tc = 0; tc < t; tc++) {
        if (!getline(cin, line)) break;
        istringstream iss(line);
        vector<string> parts;
        string tok;
        while (iss >> tok) {
            parts.push_back(tok);
        }
        vector<long long> cnts;
        if (parts.size() == 1 && parts[0].size() == 26) {
            for (char c : parts[0]) {
                cnts.push_back(c - '0');
            }
        } else {
            for (auto &p : parts) {
                cnts.push_back(stoll(p));
            }
        }
        long long total = accumulate(cnts.begin(), cnts.end(), 0LL);
        long long mx = *max_element(cnts.begin(), cnts.end());
        long long res = min(total, 2 * (total - mx) + 1);
        c

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

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

昨天 11:28
门头沟学院 Java
flmz_Kk:爷们要脸儿
点赞 评论 收藏
分享
最近在牛客上看到学弟学妹们讨论京东顶尖青年技术天才计划(TGT),其中不少牛友在探讨&nbsp;“大厂头部人才项目值不值得冲”。作为已在职场摸爬滚打近五年的过来人,回想自己毕业时,也曾在职业选择上感到迷茫。希望我一路的经历,能帮助大家更好地做出选择,并更快适应职场生活。我在2020年校招进入的京东,当时投递的是DMT(就是学弟学妹们探讨的大厂头部项目),主要负责商家AI智能助手。在京东,这一路走来,我经历了多种角色转换,从学生到职场人,从初级后端开发到后端技术专家,也见证了所在业务的蓬勃发展。如果现在问我大厂头部人才项目值不值得冲,我的答案是值得,也真心建议大家勇敢冲。经常刷牛客,也留意到很多同学刚刚走出校门、踏入职场的我们,总是对职场生活、项目研发的过程都充满着好奇,也有着各种各样的疑问,比如刚入职的我需要学习哪些东西,做哪些事情?在京东的需求开发流程是什么?这个项目需要怎么去开发?等等各种问题。不过你也不必过于担心,在京东,对于每一位DMT,都会有专门的导师来指导和帮助。我的导师就像我职场中的引路人,帮助我解决了很多困惑和问题,也帮助我更快适应了职场。比如,他会在前期告知团队中主要使用了哪些技术栈,能清晰的让我知道需要掌握哪些开发技能。这里插播个广告,我也去替大家打听了下京东顶尖青年技术天才计划(TGT),这次配备了&nbsp;“技术导师&nbsp;+&nbsp;业务导师&nbsp;+&nbsp;成长导师”&nbsp;的三重保障,我想这是大厂头部人才项目值得冲的原因之一,毕竟三重导师制真的很少见。再说回我的工作,在京东的初次封闭开发经历至今仍历历在目。当时,我们接到一项艰巨的任务——承接京东商家大会的直播需求。为了更好地应对挑战,我们首先对系统进行全面梳理,发现这个已经运行了7年的系统,架构设计陈旧,难以承受商家在直播高峰时段的巨大流量冲击,老实讲,对我们的考验不小。经过小组成员的深入讨论,我们一致决定对系统进行重构,那时,入职刚满一年多的我,得到了领导的充分信任,充满了激情与干劲,热血澎湃。随着对项目对深入,我觉得自己对业务越来越熟悉了。为了确保重构工作的顺利推进,我积极与业务和产品团队紧密协作,与业务、产品统一语言,多次沟通业务发展形态。我们无数次地围坐在一起,反复讨论领域建模的细节,力求精准把握每一个环节。同时,为了协调直播涉及的上下游部门,我们每天都会召开跨部门会议,确保各方信息畅通无阻。在紧张的准备过程中,我们还进行了多次联合压力测试,以确保系统在高流量下的稳定运行。两个月的封闭开发时光,充满了紧张与挑战。当系统最终通过测试的那一刻,我真的落泪了,深刻体会到了重构过程中的不易与艰辛。然而,所有的努力都是值得的。我们成功保障了线上线下商家大会的顺利举行,那一刻,成就感拉满。另外一个我建议大家冲大厂头部人才项目的原因是,大厂机会多、发展空间大,只要你有一股不服输的冲劲儿,就能在充满挑战的项目和完善培养机制的双重助力下,实现快速成长。入职京东后,我先后拿到了多项重要奖项,其中包括极具分量的BP2价值贡献奖,以及京东零售百强新人奖。这些荣誉给我很大的鼓励,感觉自己的付出都值得了。而最让我自豪的是,我还成功入选了京东零售技术榜样,这不仅是对我个人技术能力的肯定,更是对我不断成长的认可。在工作之余,我在京东也寻找并保持个人成长与工作的平衡。音乐是我生活中不可或缺的一部分,我在京东也找到了很多音乐搭子。每当我拿起吉他,不仅能让我放松心情,也开阔了思路。涉猎不同的领域不仅能丰富我的生活,更是对个人知识广度的一种拓宽。这种广度对于开发者来说至关重要,因为架构能力与解决复杂问题的能力,都源于知识的深度与广度的结合。仅凭所谓的“编程”知识,是无法解决那些高度抽象的复杂问题的。当然,除了努力工作,我也注重“玩得开心”,这不仅仅是简单的放松,更是为了实现工作与生活的平衡,找到工作之外的意义与价值。最后,结合我从在京东的收获和经历,真心觉得大厂头部人才项目可以放心冲!顶尖青年技术天才计划(TGT)更是放心冲!大厂的人才战略往往预示着行业变革的方向,这些机遇值得勇敢把握。
在做毕设的豹子:实习过,京东的氛围还挺好的(仅个人观点,轻喷)
点赞 评论 收藏
分享
想找对象的菠萝蜜ssp到手了:兄弟加油啊,干就完了,想这些有的没的没用 多学多练,坚定守住,秋招有机会的,我师兄很多都没实习,但是也是暑假狠狠地学了两个月 最后也都有结果的 实习很多都是打杂,有的过得也很难受,未必有你在下面好好学两个月效果好 计算机这种面试你可以说他残忍,但是他也很体现成效,只要入门了,和面试官稍微能聊起来,后面都是有收获的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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