淘天笔试 淘天算法 0322

笔试时间:2025年03月22日

历史笔试传送门:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

题目

游游正在进行字符串对照试验。他有一个长度为 n 的字符串 s 和另一个长度同样为 n 的字符串 t。他首先定义可控字符的等级:可控一级:小写字母可控二级:大写字母可控三级:数字不可控:其他字符随后,他将依次对每个 i (1 ≤ i ≤ n) 进行以下操作:如果 s 和 t 的第 i 个字符都是可控的,且等级相同,则输出这两个字符对应的中位 ASCII 码所表示的字符。如果 s 和 t 的第 i 个字符都是可控的,但等级不同,则输出这两个字符的中位 ASCII 码(数值)。否则,直接输出一个下划线 "_"。其中,中位 ASCII 码定义为两个字符 ASCII 码值的平均值向上取整。

输入描述

第一行:正整数 n (1 ≤ n ≤ 3×10^5)

第二行:字符串 s

第三行:字符串 t

输出描述

操作之后得到的字符串。

样例输入

9

CiaLlo!?.

dAmE*+-/

样例输出

8485gI_____

参考题解

模拟

C++:[此代码未进行大量数据的测试,仅供参考]

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

int get_level(char ch) {
    if ('a' <= ch && ch <= 'z') {
        return 1;  // 可控一级
    } else if ('A' <= ch && ch <= 'Z') {
        return 2;  // 可控二级
    } else if ('0' <= ch && ch <= '9') {
        return 3;  // 可控三级
    } else {
        return 0;  // 不可控
    }
}

void solve() {
    int n;
    cin >> n;
    string s, t;
    cin >> s >> t;
    
    vector<char> result;
    
    for (int i = 0; i < n; i++) {
        int level_s = get_level(s[i]);
        int level_t = get_level(t[i]);
        
        if (level_s != 0 && level_t != 0) {
            int mid_ascii = (s[i] + t[i] + 1) / 2;
            if (level_s == level_t) {
                result.push_back(char(mid_ascii));
            } else {
                result.push_back(char(mid_ascii));
            }
        } else {
            result.push_back('_');
        }
    }
    
    for (char ch : result) {
        cout << ch;
    }
    cout << endl;
}

int main() {
    solve();
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.*;

public class Main {
    public static int getLevel(char ch) {
        if ('a' <= ch && ch <= 'z') {
            return 1;  // 可控一级
        } else if ('A' <= ch && ch <= 'Z') {
            return 2;  // 可控二级
        } else if ('0' <= ch && ch <= '9') {
            return 3;  // 可控三级
        } else {
            return 0;  // 不可控
        }
    }

    public static void solve() {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String s = sc.next();
        String t = sc.next();

        StringBuilder result = new StringBuilder();
        
        for (int i = 0; i < n; i++) {
            int level_s = getLevel(s.charAt(i));
            int level_t = getLevel(t.charAt(i));

            if (level_s != 0 && level_t != 0) {
                int mid_ascii = (s.charAt(i) + t.charAt(i) + 1) / 2;
                if (level_s == level_t) {
                    result.append((char) mid_ascii);
                } else {
                    result.append(Integer.toString(mid_ascii));
                }
            } else {
                result.append('_');
            }
        }
        
        System.out.println(result.toString());
    }

    public static void main(String[] args) {
        solve();
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

def solve():
    import sys
    data = sys.stdin.read().strip().split()
    n = int(data[0])
    s = data[1]
    t = data[2]

    def get_level(ch):
        if 'a' <= ch <= 'z':
            return 1  # 可控一级
        elif 'A' <= ch <= 'Z':
            return 2  # 可控二级
        elif '0' <= ch <= '9':
            return 3  # 可控三级
        else:
            return 0  # 不可控

    result = []
    for i in range(n):
        level_s = get_level(s[i])
        level_t = get_level(t[i])
        # 如果两者均可控
        if level_s != 0 and level_t != 0:
            # 计算中位 Ascii 码 (向上取整)
            mid_ascii = (ord(s[i]) + ord(t[i]) + 1) // 2
            if level_s == level_t:
                # 等级相同 -> 输出字符
                result.append(chr(mid_ascii))
            else:
                # 等级不同 -> 输出数字(字符串形式)
                result.append(str(mid_ascii))
        else:
            result.append('_')
    print(''.join(result))
solve()

第二题

题目

对于给定的正整数 n 和正整数 m,求解下式:

n xor (n/2) mod m这显然难不倒你,所以我们将会使用一种特殊的方式给出 n 的二进制形式:

给出一个由 k 个整数构成的数组 (a1, a2, …, ak),其中,第 i 个整数 ai 表示 n 的二进制表示中,从高位到低位,恰好有连续 ai 个 (i mod 2) 的数字。更具体地,如果数组 a = {3, 4, 1, 2},那么,第一个整数 a1 表示有 3 个 1(因为 3 mod 2 = 1),第二个整数 a2 表示有 4

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

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

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

全部评论

相关推荐

06-05 00:54
已编辑
北京邮电大学 前端工程师
蹲个女生舍友,杭州西溪。--------------以下是正文--------------先说一下我个人情况,北邮通信工程,我在本科的时候做过几个微信小程序,忘光了。在今年2月份开始极速学习前端基础。代码算法方面,研一和大四的时候跟着代码随想录刷过一次。轻微流水账,这是一个记录贴。初衷希望能给0实习转码的同学一些鼓励,相信一定能找到愿意培养自己的公司。第一次找工作没什么经验,秋招会及时复盘面经发出来,这次就先不弄了。我从1月份就开始调研咋学习前端,开始慢悠悠学习html和css知识,到二月份开学了才开始对暑期实习感到十分的担忧,开始拼命学js。之前就接触过相关内容所以学的很快,半个月左右就学完了。然后就开始一边学习react一边做项目。4月初开始陆续投递,等了一周就开始有面试了。第一个面的美团,上来就是一个hard代码题,hot100还没刷完的我感到十分挫败。五月中旬之前,我一直处于反复一面的状态。基本上一天三面。晚上还得做笔试。崩溃边缘,但是还得鼓励(欺骗)自己下周必拿offer。或许是乐观的心态,让我在16号以后开始收到一些公司的二面了。包括美团,阿里(智能信息),腾讯,字节。我非常高兴,说明我五一不出去玩,恶补八股和手撕是真的有用。运气好了之后就开始一直破天荒的好。我阿里的淘天和阿里云也进二面了。我记得自己虽然表现的还行,但是整体并不突出。5月20/21号,这两天是小情侣过节的日子。我记得我20号面了美团,阿里智能信息二面,21号面了腾讯,字节,淘天二面,晚上还做了一个笔试。累的半死的同时,实验室导师还在催我的科研进度,我回复:好的。没想到,阿里智能信息居然问了我通信原理,本科学科等很多很泛的问题。我以为要凉了,结果没过一个小时,hr联系我:你好,你的二面已经通过,需要您再做一个线上笔试。我欣喜若狂,不敢相信二面居然问这些都能过。笔试做完了之后,也是立马有hr联系我,约hr面。5月22号,hr面。当场发offer,我整个人都懵了。心里怀疑对方是不是诈骗公司,然后又反复确认。缓了半天,才发现自己居然能去阿里了。简直是做梦都不敢想。我记得我前几天面试压力太大,还梦到过实验室组会汇报自己的offer进度,大家都去阿里。而我连甚至一个offer都没有可以汇报。当场吓醒。最后必须说,阿里真的太好了,愿意相信实习生的潜力,真的给了很多0实习的同学实习机会。我永远是阿里孝女!!!!!---------------分割线-----------记录一下自己转码以来遇到的一些贵人。1.字节的一面面试官,在我最崩溃的时候给了我鼓励和肯定。当时给我面了一个半小时。最后我问他对建议的时候,他说,“你是候选人里面算是比较优秀的了,但是我们这个业务要求很高,我担心把你招进来影响你的成长。”并且还给我推荐学习资料,红宝书。还和我说,“如果你想要继续做前端的话,我可以告诉你,前端依然是十分有前途的方向,希望你可以继续努力。”他的话真的十分中肯。当时我甚至感动哭了,我非常清楚自己不是因为被拒绝哭了(毕竟其实已经麻了)2.腾讯的一位面试官。给了我很多叮咛,告诉我准备好在面试等等。让我感觉十分有力量,我当时觉得我身边那么多帮助我的好人,我怎么可能不成功呢。3.北邮的一位学长,他在一开始给了我职业选择方面的建议,让我坚定了自己的道路。4.我遇到的每一个面试官都出奇的好,没有因为我很菜就表现不耐烦,十分感恩他们的手下留情。5.感谢有对象的陪伴,让我有好好吃饭的动力,并且也一直督促我学习,还帮我把一些高频的手撕和高频的计算机相关的八股梳理出来。有的时候真的想放弃,但是他一直在我旁边和我说,一定要坚持,不能放弃。
点赞 评论 收藏
分享
05-23 01:07
门头沟学院 Java
主要是针对黑马点评项目,欢迎uu解答讨论,急需学习1.&nbsp;讲一下登录注册过程2.&nbsp;你是怎么将验证码发送到用户手机上的?3.&nbsp;你了解过什么公司有这种发送验证码的业务的?4.&nbsp;如果设计用户密码登录,密码应该怎么传输?(回答加密之后传输,唯一知道的:hash+加盐,https传输)5.&nbsp;如果设计一种用户通过密码注册的方式,前端接口需要收集什么数据,怎么传到后端?讲一下这个流程6.&nbsp;按照你说的在前端进行拦截再对密码加密,加密后的内容发送给后端的话,每次加盐的这个盐不一样,传输的同一用户的加密密码还能是一样的吗?7.&nbsp;token是怎么传递给前端的?(回答写在响应体里的,后来查了下好像是写在响应头里的)那token在前端是存储在哪里的?8.&nbsp;如果token泄露了,攻击者利用token向后端发送请求怎么办?(只能想到https加密,再就是通过ip进行查验)9.&nbsp;http和https的区别?10.&nbsp;讲一下https里非对称加密和对称加密11.&nbsp;非对称加密的算法了解过吗?(只知道hash和散列,还不知道是对称加密还是非对称加密的)12.&nbsp;hashmap的底层?什么时候用红黑树,什么时候用链表?为什么是8的时候?13.&nbsp;concurrenthashmap的底层?14.&nbsp;为什么不是线程安全的,头插法和尾插法的区别15.&nbsp;如果你现在要插入7个数,你怎么设计hashmap的容量?16.&nbsp;如果用hashmap,怎么设计让他线程安全?(对put方法加锁,还说了volatile,后面他说基础类型和引用类型,你在这里对hashmap加volatile有用吗)17.&nbsp;第一个项目讲一下,你是调用的一个视频处理的接口吗?还是在上面训练过18.&nbsp;拦截器拦截的是什么?讲一下拦截的过程?中途打断,那你的threadlocal是从哪里获取数据的?19.&nbsp;讲一下缓存更新策略,实际用的是什么?(修改数据库后删除缓存)20.&nbsp;如果你要将商户信息存进redis里,你怎么选取哪一部分商户?(我回答说例如对评分前十的商户,会将这些商户信息存到redis里方便页面显示,然后问那你是在什么时机选取的评分前十呢?这些商户信息具体是怎么存到redis里的)
咕噜灵波:建议了解一下jwt token和session和cookie的区别和优缺点;看一下ssl/tls握手;java动态代理和Aop;threadlocal底层原理和java gc;hashmap的和arraylist扩容原理,java集合和juc
查看20道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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