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