淘天笔试 淘天算法 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等多种语言做法集合指南

全部评论

相关推荐

一面技术面,面试官应该是一个老骑手了,懂得很多,拷打的很深,很多问题我都答不上来,感觉进不了站长二面了。。。1.自我介绍,有什么特质适应骑手的工作然后开始问情景题2.假设你午高峰时同时配送多个订单,cbd有5个订单同时超时预警,其中3个在写字楼20层以上且电梯排队,1个是容易洒的汤品,另1个客户备注“迟到就拒收,等着差评吧”,你会如何设计这次配送的策略?根本答不出来,感觉就不应该一次接这么多单。。。。我回答应该按照距离来看,然后再先满足汤品,然后送备注的那个客户,最后再送写字楼的,面试官感觉不是很满意。。。3.调度系统发现骑手在午高峰时只接距离近、单价高的订单,导致长距离订单积压。作为平台方,你会如何优化调度算法来平衡骑手收益和用户体验?答不上来。。。骑手岗为什么会问到平台方啊,直接说不清楚,换个问题4.换了个问题,现在你手上已经有4个订单,全部临近超时,这时系统突然推送一个肥单,配送费翻倍。但接了必然导致已有订单超时。你会怎么决策?答应该放弃肥单,肯定不能超时啊。。。不知道为什么要问这个,感觉现在美团特别喜欢问超时的情况?感觉面试官已经有些不耐烦了。。。。回答的确实不好,可能这些问题对于老骑手来说很简单吧,然后问了道算法5.算法:给定一个地图(用邻接矩阵表示),m个取餐点和n个送餐点坐标,你当前位于取餐点1,计算最优路径,使得总行驶距离最短,且所有餐点都取到后再开始配送,要用贪心,但是时间太短了没做出来。。。6.反问,我问了咱们站点主要接的单是周围多大范围的,爬楼多不多,面试官回答要具体看情况,不好说,但是爬楼肯定要爬。然后又问了问面试官个人对于差评是怎么看的,大概差评率多高算高,面试官说越低越好,不好确定,怎么感觉什么都没问出来。。。感觉要挂了,发个面经攒功德,如果挂了我就投隔壁京东骑手了,那边貌似缺人,应该好进一些。。。。有无uu已经是骑手的给个内推?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务