饿了么笔试 饿了么笔试题 0328

笔试时间:2025年03月28日

历史笔试传送门:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

题目:大小写转化

对于给定的由大小写字母混合构成的字符串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 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务