淘天笔试 淘天算法 0322
笔试时间:2025年03月22日
历史笔试传送门:
第一题
题目
游游正在进行字符串对照试验。他有一个长度为 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打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

