餓了么筆試 餓了么筆試題 0328
筆試時間:2025年03月28日
歷史筆試傳送門:
第一題
題目:大小寫轉(zhuǎn)化
對于給定的由大小寫字母混合構(gòu)成的字符串s,下標(biāo)從1開始,我們需要將每一個k的倍數(shù)位進(jìn)行大小寫轉(zhuǎn)換(即對于第k,2*k...位),而對于其他位置,無論大小寫,直接使用其ASCII碼替換其在字符串中的位置(從1開始)。由于這樣得到的字符串可能非常長,所以,我們一共會提出q次詢問,每一次詢問給定一個區(qū)間[l,r],您只需要輸出這 個區(qū)間中的全部字符。
輸入描述
第一行輸入一個正整數(shù)k(1 ≤ k ≤ 10^5),代表進(jìn)位倍數(shù)。
第二行輸入一個長度為1 ≤ len(s) ≤ 10^6,由大小寫字母構(gòu)成的字符串s,代表需要進(jìn)行操作的字符串。
第三行輸入一個正整數(shù)q(1 ≤ q ≤ 100),代表詢問次數(shù)。
此后q行,每行輸入兩個正整數(shù)l,r(1 ≤ l ≤ r ≤ len(s'))代表詢問的區(qū)間。
在這里,len(s')代表操作全部完成后的字符串長度。除此之外,保證輸出的字符數(shù)量不超過2x10^5
輸出描述
對于每一次詢問,新起一行。輸出一個字符串,代表詢問的區(qū)間中的全部字符。
樣例輸入
2
аABbсC
3
1 1
2 4
8 9
樣例輸出
9
7a6
9c
提示:根據(jù)題意,需要對 2,4,6 位進(jìn)行大小寫轉(zhuǎn)換,轉(zhuǎn)換后得到"aaBBcc"。隨后,對于1,3,5位,使用其ASCII碼替換其在字符串中的位置,最終得到字符串"97a66B99c"。
參考題解
C++:[此代碼未進(jìn)行大量數(shù)據(jù)的測試,僅供參考]
#include <bits/stdc++.h> usingnamespacestd; int main() { int k; cin >> k; string s; cin >> s; string t = ""; for (int i = 0; i < s.length(); i++) { char ch = s[i]; if ((i + 1) % k == 0) { if (isupper(ch)) t += tolower(ch); else t += toupper(ch); } else t += to_string((int)ch); } int q; cin >> q; while (q-- > 0) { int lc, rc; cin >> lc >> rc; cout << t.substr(lc - 1, rc - lc + 1) << endl; } return0; }
Java:[此代碼未進(jìn)行大量數(shù)據(jù)的測試,僅供參考]
import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int k = scanner.nextInt(); String s = scanner.next(); StringBuilder t = new StringBuilder(); for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); if ((i + 1) % k == 0) { if (Character.isUpperCase(ch)) { t.append(Character.toLowerCase(ch)); } else { t.append(Character.toUpperCase(ch)); } } else { t.append((int) ch); } } int q = scanner.nextInt(); while (q-- > 0) { int lc = scanner.nextInt(); int rc = scanner.nextInt(); System.out.println(t.substring(lc - 1, rc)); // substring(start, end) - end is exclusive } scanner.close(); } }
Python:[此代碼未進(jìn)行大量數(shù)據(jù)的測試,僅供參考]
k = int(input()) s = input() t = "" for i in range(len(s)): ch = s[i] if (i + 1) % k == 0: if ch.isupper(): t += ch.lower() else: t += ch.upper() else: t += str(ord(ch)) q = int(input()) for _ in range(q): lc, rc = map(int, input().split()) print(t[lc - 1:rc])
第二題
題目:最小的m
給你一個數(shù) n ,讓你找到最小的 m ,使得 n 能被 m 整除(也就是n mod m = 0)且 n/m 是質(zhì)數(shù),若不存在符合要求的m輸出0。
輸入描述
第一行輸入一個整數(shù)T,代表有T組測試數(shù)據(jù)。
接下來T行,每一行輸入一個整數(shù)n1 ≤ T ≤ 100l ≤ n ≤ 10^9
輸出描述
對于每組數(shù)據(jù)輸出一行,代表最小的m,如果答案不存在輸出 0。
樣例輸入
4
3
4
5
6
樣例輸出
1
2
1
2
參考題解
題目要我們找一個n的最小因數(shù)m,使得n/m是質(zhì)數(shù)。不妨記n/m=x,可以想到當(dāng)x是n的最大質(zhì)因數(shù)時,n/x得到m就是所求答案,所以問題變成找一個數(shù)的最大質(zhì)因數(shù),直接暴力即可。
C++:[此代碼未進(jìn)行大量數(shù)據(jù)的測試,僅供參考]
#incl
剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購買
2025打怪升級記錄,大廠筆試合集 C++, Java, Python等多種語言做法集合指南