小红书笔试 小红书笔试题 0817

笔试时间:2025年8月17日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

小红书生态团队在评论审核中,需要对得分接近的评论判定观点相近,这一判断逻辑可以帮助团队灵活的调整评论区的观点统一性/观点多样性。 现在,将模型简化如下:给定长度为n的整数数组{a1,a2,…an}和一个整数 d。若|ai-aj|≤d,则称 ai与aj观点相近。一次操作可以选择一对元素,并将其同时从数组中删除(数组长度减少2)。 经过若干操作后,需要保证数组中不含任何观点相近的元素,且希望保留的元素数量尽可能多。请你计算,经过若干操作后,最终保留下来的最大元素数量。

输入描述

每个测试文件均包含多组测试数据。第一行输入一个整数T(1≤T≤10^4)代表数据组数,每组测试数据描述如下: 第一行输入两个整数 n和 d(1≤n≤2*10^5;0≤d≤10^9),表示数组长度、观点相近的阈值。

第二行输入 n个整数 a1,a2,…an(0≤ai≤10^9),表示数组元素。

除此之外,保证单个测试文件的n之和不超过2*10^5。

输出描述

对于每组测试数据,新起一行输出一个整数,表示最终保留下来的最大元素数量。

样例输入

2

5 2

1 2 4 7 9

4 0

1 1 2 5

样例输出

3

2

参考题解

我们需要从数组中移除偶数个元素(通过多次移除一对元素实现),使得剩余元素中没有任何两个元素的差值绝对值 ≤ d(即无“观点相近”元素)。 目标是最大化剩余元素的数量。 等价于:找到一个最大子集 S,其中 S 中任意两元素差 > d,且 n - |S| 为偶数(因为移除数量必须偶数)。该问题可建模为在一维数轴上的点集,禁止距离 ≤ d 的点共存。这是一个区间图(interval graph)的最大独立集问题。 由于数组排序后,冲突关系是连续的,可以用贪心高效求解最大独立集大小(无视奇偶约束下的最大剩余)。步骤如下:排序数组: 将数组 a 按升序排序,便于处理差值。计算无约束最大剩余(max_possible):使用贪心:从左到右,尽可能多选元素,确保选中的元素间差 > d。初始化 last = -∞,计数 S = 0。遍历每个元素 x:如果 x > last + d,则选中它:S += 1,更新 last = x。这个 S 就是最大独立集大小(无奇偶约束下的最大剩余),因为在排序序列上,这种贪心能覆盖最优选择(类似于区间调度,避免了动态规划的 O(n) 空间/时间复杂,但这里时间 O(n log n) 因排序)。处理奇偶约束:移除数量 = n - S,必须为偶数。如果 (n - S) % 2 == 0,则直接返回 S(剩余与 n 同奇偶)。否则,返回 S - 1(多移除一个元素,使移除数量变为奇数 +1 = 偶数)。为什么 S - 1 可行?因为从最大独立集中移除一个元素,仍是合法独立集,且空集也合法(若 S=1 且需调整)。

C++:

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;
    while (T--) {
        int n;
        long long d;
        cin >> n >> d;
        vector<long long> a(n);
        for (int i = 0; i < n; i++) cin >> a[i];
        sort(a.begin(), a.end());

        long long last = -(long long)1e10;
        int S = 0;
        for (long long x : a) {
            if (x > last + d) {
                S++;
                last = x;
            }
        }

        if ((n - S) % 2 == 0) cout << S << "\n";
        else cout << S - 1 << "\n";
    }
    return 0;
}

Java:

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine().trim());
        while (T-- > 0) {
            String[] parts = br.readLine().split(" ");
            int n = Integer.parseInt(parts[0]);
            long d = Long.parseLong(parts[1]);

            String[] arr = br.readLine().split(" ");
            long[] a = new long[n];
            for (int i = 0; i < n; i++) {
                a[i] = Long.parseLong(arr[i]);
            }
            Arrays.sort(a);

            long last = -(long)1e10;
            int S = 0;
            for (long x : a) {
                if (x > last + d) {
                    S++;
                    last = x;
                }
            }

            if ((n - S) % 2 == 0) {
                System.out.println(S);
            } else {
                System.out.println(S - 1);
            }
        }
    }
}

Python:

T = int(input())
for _ in range(T):
    n, d = map(int, input().split())
    a = list(map(int, input().split()))
    a.sort()
    S = 0
    last = - (10**10)
    for x in a:
        if x > last + d:
            S += 1
            last = x
    if (n - S) % 2 == 0:
        print(S)
    else:
        print(S - 1)

第二题

现在有n条 Plog 在首页上排成一列,队尾在下侧,队头在上侧。用长度为n的01串S=s1s2....sn,表示这条队列,其中:若 si=1,则第i条 Plog 属于美食;若 si=0,则第i条 Plog 属于旅行。一共会进行无限轮互评操作,每一轮:1.所有 Plog 的拥有者同时向队头(右侧)互评;2.互评只会影响每条 Plog 右侧的第一个异属性 Plog,如果右侧没有异属性 Plog,则不会产生互评操作;3.每轮所有互评动作并行计算,然后一次性将所有已经有评论的 Plog 移出,形成新队列再进入下一轮;同一条 Plog 在一轮可能收获多条评价。显然,无限进行下去,终究会出现不再有互评发生的情况。求整个过程中共有多少条 Plog 收获评价。

输入描述

第一行输入一个整数 n(1≤n≤10^5),表示 Plog 数量。

第二行输入一个长度为 n 且只由字符'0'和'1'构成的字符串 s,表示 Plog 的属性分布。

其中其中si为从左向右第i条 Plog 的属性。

输出描述

输出一个整数,表示所有互评结束后共有多少条Plog 收获评价。

样例输入

10

1100010101

样例输出

8

参考题解

分块处理将连续的同种 Plog 视为一个“块”。 例如 1100010101 -> [2, 3, 1, 1, 1, 1, 1]。识别攻守方第一个块 a[0] 只攻击不被攻击,因此必定完全幸存。我们可将所有块分为两类:与 a[0] 同属性的A组(下标0, 2, 4...)和不同属性的B组(下标1, 3, 5...)。整个互评过程,可以看作是 A组 和 B组 的相互消耗。确定关键轮数 T

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

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

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

全部评论

相关推荐

05-29 19:11
已编辑
北方民族大学 Java
😭😭😭😭本人26届双非本,后端选手。从25年秋招开始,一直到春招5月份,一共面了12次字节。可以说后面能继续投递面上字节大概率是因为前面一直累计的面评还不错,但是最终的结果往往不尽如人意,黄梁一梦。timeline:如标题,总共面了12次字节,4个不同的岗位。第一次:抖音生活服务测开二面完排序挂第二次:TikTok国际化电商测开三面完排序挂第三次:飞书后端安全团队三面完挂第四次:飞书后端偏基架团队三面完过,HR面完之后询问综合排序不推进。我知道像BAT这样的公司,双非本想拿到一张入场券有多难,也知道每次挂在排序/三面/HR面,那种差一步上岸又被打回原点的落差感有多磨人。可是最后一次字节的这个岗位,已经是5月中旬才开始面得了,春招末期的岗位,我本以为真的缺人,三面过的那天,我真的以为就差一步hr面就稳了,但是,最终的结果很遗憾,综合排序综合排序,不推进了。如果是技术能力的问题,我想也不会每一轮技术面给我通过。思来想去。难道真的就是因为我们双非有案底,所以最后的一切又算什么呢。付出这么多的时间精力,还是抵不过双非学历太差吗?既然如此一开始直接卡掉简历不用给面试不就行了嘛,每一轮面试都给我们生的希望,最后的最后又回到了那个必输的起点。12次字节,说不遗憾是假的,也无数次怀疑过自己:是不是我算法刷得还不够?是不是项目亮点讲得不够好?是不是学历就是一道跨不过去的坎?但回头看,这一年的秋招到春招,从面对面试官紧张到说话卡壳,到后来的从容面对,再到如今甚至能和面试官探讨AI&amp;大模型技术的一些方案思路,我已经比去年的自己强太多了。可能字节于我,真的是一场盛大的单恋,拼尽全力奔赴,却还是没能收到想要的回应。前路漫漫,字节的梦碎了,但我的路还在继续,希望下一站,会有属于我的一场徐风。
不愿吃饼的山羊很友好:你的心理素质是真的强大,如果是我碰到这样都会疯了
点赞 评论 收藏
分享
评论
点赞
4
分享

创作者周榜

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