字节笔试 字节笔试题 0504

笔试时间:2025年5月4日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

现有一个长度为 n 的正整数数组 a,你能否在其中找出 3 个正整数,它们无法构成三角形。如果可以则输出 "Yes",否则输出 "No"。

输入描述

本题为多组测试数据:

第一行输入一个正整数 T,代表测试数据组数。

对于每组测试数据:

第一行输入一个正整数 n,代表数组长度。

第二行输入 n 个正整数 ai,代表数组的元素。

输出描述

输出 T 行,每行输出 "Yes" 或 "No"。输出 T 行,每行输出 "Yes" 或 "No"。

样例输入

2

6

3 4 5 6 6 6

5

1 1 5 5 5

样例输出

No

Yes

参考题解

先把数组从小到大排好,然后用一个窗口依次考察每三个相邻的数:如果遇到某组三条边中最小的两条和不大于最大那条,就说明这三条根本凑不成三角形,立刻输出 “Yes”;如果整个遍历结束都没发现这样的三元组,就输出 “No”。

C++:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int T;
    cin >> T;
    for (int _ = 0; _ < T; _++) {
        int n;
        cin >> n;
        vector<int> a(n);
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        sort(a.begin(), a.end());
        bool f = false;
        for (int i = 2; i < n; i++) {
            if (a[i - 2] + a[i - 1] <= a[i]) {
                cout << "Yes" << endl;
                f = true;
                break;
            }
        }
        if (!f) {
            cout << "No" << endl;
        }
    }
    return 0;
}

Java:

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt();
        for (int _ = 0; _ < T; _++) {
            int n = scanner.nextInt();
            int[] a = new int[n];
            for (int i = 0; i < n; i++) {
                a[i] = scanner.nextInt();
            }
            Arrays.sort(a);
            boolean f = false;
            for (int i = 2; i < n; i++) {
                if (a[i - 2] + a[i - 1] <= a[i]) {
                    System.out.println("Yes");
                    f = true;
                    break;
                }
            }
            if (!f) {
                System.out.println("No");
            }
        }
        scanner.close();
    }
}

Python:

T = int(input())
for _ in range(T):
    n = int(input())
    a = list(map(int, input().split()))
    a.sort()
    f = False
    for i in range(2, n):
        if a[i - 2] + a[i - 1] <= a[i]:
            print("Yes")
            f = True
            break
    if not f:
        print("No")

第二题

小红拿到了一个仅由英文字母组成的字符串。她想知道某单词在该字符串中出现了多少次,你能帮帮她吗? 请注意,小红会询问多次。

输入描述

第一行输入两个正整数 n 和 q,代表字符串长度和询问次数。

第二行输入一个长度为 n 的,仅由小写英文字母组成的字符串,代表小红拿到的字符串。

接下来的 q 行,每行输入一个仅由小写英文字母组成的字符串,代表小红的每次查询。

数据范围: 1 ≤ n, q ≤ 10⁵ 每次查询的字符串长度不超过 10。

输出描述

输出 q 行,每行输出一个整数,代表该次查询的结果。

样例输入

10 3

bobobalice

bob

alice

red

样例输出

2

1

0

参考题解

C++:

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;

int main() {
    int n, q;
    cin >> n >> q;
    cin.ignore(); // 忽略换行符
    string s;
    getline(cin, s);
    unordered_map<string, int> mp;
    for (int i = 1; i <= 10; i++) {
        for (int j = i - 1; j < n; j++) {
            string str_part = s.substr(j - i + 1, i);
            mp[str_part]++;
        }
    }
    for (int _ = 0; _ < q; _++) {
        string p;
        getline(cin, p);
        cout << mp[p] << endl;
    }
    return 0;
}

Java:

import java.util.HashMap;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int q = scanner.nextInt();
        scanner.nextLine(); // 消耗掉换行符
        String s = scanner.nextLine();
        HashMap<String, Integer> mp = new HashMap<>();
        for (int i = 1; i <= 10; i++) {
            for (int j = i - 1; j < n; j++) {
                String strPart = s.substring(j - i + 1, j + 1);
                mp.put(strPart, mp.getOrDefault(strPart, 0) + 1);
            }
        }
        for (int _ = 0; _ < q; _++) {
            String p = scanner.nextLi

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2025 春招笔试合集 文章被收录于专栏

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

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务