淘天筆試 淘天算法 0322
筆試時(shí)間:2025年03月22日
歷史筆試傳送門:
第一題
題目
游游正在進(jìn)行字符串對照試驗(yàn)。他有一個(gè)長度為 n 的字符串 s 和另一個(gè)長度同樣為 n 的字符串 t。他首先定義可控字符的等級:可控一級:小寫字母可控二級:大寫字母可控三級:數(shù)字不可控:其他字符隨后,他將依次對每個(gè) i (1 ≤ i ≤ n) 進(jìn)行以下操作:如果 s 和 t 的第 i 個(gè)字符都是可控的,且等級相同,則輸出這兩個(gè)字符對應(yīng)的中位 ASCII 碼所表示的字符。如果 s 和 t 的第 i 個(gè)字符都是可控的,但等級不同,則輸出這兩個(gè)字符的中位 ASCII 碼(數(shù)值)。否則,直接輸出一個(gè)下劃線 "_"。其中,中位 ASCII 碼定義為兩個(gè)字符 ASCII 碼值的平均值向上取整。
輸入描述
第一行:正整數(shù) n (1 ≤ n ≤ 3×10^5)
第二行:字符串 s
第三行:字符串 t
輸出描述
操作之后得到的字符串。
樣例輸入
9
CiaLlo!?.
dAmE*+-/
樣例輸出
8485gI_____
參考題解
模擬
C++:[此代碼未進(jìn)行大量數(shù)據(jù)的測試,僅供參考]
#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:[此代碼未進(jìn)行大量數(shù)據(jù)的測試,僅供參考]
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:[此代碼未進(jìn)行大量數(shù)據(jù)的測試,僅供參考]
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: # 計(jì)算中位 Ascii 碼 (向上取整) mid_ascii = (ord(s[i]) + ord(t[i]) + 1) // 2 if level_s == level_t: # 等級相同 -> 輸出字符 result.append(chr(mid_ascii)) else: # 等級不同 -> 輸出數(shù)字(字符串形式) result.append(str(mid_ascii)) else: result.append('_') print(''.join(result)) solve()
第二題
題目
對于給定的正整數(shù) n 和正整數(shù) m,求解下式:
n xor (n/2) mod m這顯然難不倒你,所以我們將會使用一種特殊的方式給出 n 的二進(jìn)制形式:
給出一個(gè)由 k 個(gè)整數(shù)構(gòu)成的數(shù)組 (a1, a2, …, ak),其中,第 i 個(gè)整數(shù) ai 表示 n 的二進(jìn)制表示中,從高位到低位,恰好有連續(xù) ai 個(gè) (i mod 2) 的數(shù)字。更具體地,如果數(shù)組 a = {3, 4, 1, 2},那么,第一個(gè)整數(shù) a1 表示有 3 個(gè) 1(因?yàn)?3 mod 2 = 1),第二個(gè)整數(shù) a2 表示有 4
剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購買
2025打怪升級記錄,大廠筆試合集 C++, Java, Python等多種語言做法集合指南