饿了么笔试 饿了么笔试题 0328
笔试时间:2025年03月28日
历史笔试传送门:
第一题
题目:大小写转化
对于给定的由大小写字母混合构成的字符串s,下标从1开始,我们需要将每一个k的倍数位进行大小写转换(即对于第k,2*k...位),而对于其他位置,无论大小写,直接使用其ASCII码替换其在字符串中的位置(从1开始)。由于这样得到的字符串可能非常长,所以,我们一共会提出q次询问,每一次询问给定一个区间[l,r],您只需要输出这 个区间中的全部字符。
输入描述
第一行输入一个正整数k(1 ≤ k ≤ 10^5),代表进位倍数。
第二行输入一个长度为1 ≤ len(s) ≤ 10^6,由大小写字母构成的字符串s,代表需要进行操作的字符串。
第三行输入一个正整数q(1 ≤ q ≤ 100),代表询问次数。
此后q行,每行输入两个正整数l,r(1 ≤ l ≤ r ≤ len(s'))代表询问的区间。
在这里,len(s')代表操作全部完成后的字符串长度。除此之外,保证输出的字符数量不超过2x10^5
输出描述
对于每一次询问,新起一行。输出一个字符串,代表询问的区间中的全部字符。
样例输入
2
аABbсC
3
1 1
2 4
8 9
样例输出
9
7a6
9c
提示:根据题意,需要对 2,4,6 位进行大小写转换,转换后得到"aaBBcc"。随后,对于1,3,5位,使用其ASCII码替换其在字符串中的位置,最终得到字符串"97a66B99c"。
参考题解
C++:[此代码未进行大量数据的测试,仅供参考]
#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:[此代码未进行大量数据的测试,仅供参考]
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:[此代码未进行大量数据的测试,仅供参考]
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
给你一个数 n ,让你找到最小的 m ,使得 n 能被 m 整除(也就是n mod m = 0)且 n/m 是质数,若不存在符合要求的m输出0。
输入描述
第一行输入一个整数T,代表有T组测试数据。
接下来T行,每一行输入一个整数n1 ≤ T ≤ 100l ≤ n ≤ 10^9
输出描述
对于每组数据输出一行,代表最小的m,如果答案不存在输出 0。
样例输入
4
3
4
5
6
样例输出
1
2
1
2
参考题解
题目要我们找一个n的最小因数m,使得n/m是质数。不妨记n/m=x,可以想到当x是n的最大质因数时,n/x得到m就是所求答案,所以问题变成找一个数的最大质因数,直接暴力即可。
C++:[此代码未进行大量数据的测试,仅供参考]
#incl
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南