小红书笔试 小红书笔试题 0914

笔试时间:2024年09月14日 秋招

历史笔试传送门:2023秋招笔试合集

第一题

题目:小红的文章匹配

小红书的第 i 篇文章有一个点赞数 ai 。小红认为,如果两篇不同的文章满足:点赞数通过位异或运算恰好得到 k ,那么这两篇文章是相似文章,即ai xor aj=k 。现在小红收集到了 n 篇文章的点赞数,请帮助她计算出有多少对 (i,j) 是相似文章。

输入描述

第一行输入两个整数n,k代表文章总数与相似文章判断值。

第二行输入 n 个整数 a1,a2,...,an(0≤ai≤) 代表每篇文章的点赞数。

输出描述

在一行上输出一个整数,代表相似文章的对数。

样例输入

4 5

1 1 3 4

样例输出

2

提示:可以发现,1 xor 4 = 5 ,那么文章一和四、文章二和四为两对相似文章。

参考题解

a xor b = c,则a xor c =b,对每篇文章i,找多少其他文章=a[i] xor k即可。

C++:[此代码未进行大量数据的测试,仅供参考]

#include<cstdio>
#include<iostream>
#include<map>
using namespace std;
map<int,int>c;
int a[200005];
long long ans=0;
int main()
{
    int n,k;
    cin>>n>>k;
    for (int i=1; i<=n; i++)
    {
        cin>>a[i];
        c[a[i]]++;
    }
    for (int i=1; i<=n; i++)
        if (c[a[i]^k])
            ans+=c[a[i]^k]-(a[i]==(a[i]^k));
    cout<<ans/2<<endl;
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

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

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Map<Integer, Integer> c = new HashMap<>();
        long ans = 0;
        
        int n = sc.nextInt();
        int k = sc.nextInt();
        int[] a = new int[n + 1];
        
        for (int i = 1; i <= n; i++) {
            a[i] = sc.nextInt();
            c.put(a[i], c.getOrDefault(a[i], 0) + 1);
        }
        
        for (int i = 1; i <= n; i++) {
            int target = a[i] ^ k;
            if (c.containsKey(target)) {
                ans += c.get(target) - (a[i] == target ? 1 : 0);
            }
        }
        
        System.out.println(ans / 2);
        sc.close();
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

def main():
    c = {}
    ans = 0

    n, k = map(int, input().split())
    a = [0] * (n + 1)

    for i in range(1, n + 1):
        a[i] = int(input())
        if a[i] in c:
            c[a[i]] += 1
        else:
            c[a[i]] = 1

    for i in range(1, n + 1):
        target = a[i] ^ k
        if target in c:
            ans += c[target] - (1 if a[i] == target else 0)

    print(ans // 2)

if __name__ == "__main__":
    main()

第二题

题目:魔法阅读室

小红书总部有一间神秘的魔法阅读室,它四四方方的,三边长为 x,y 和 z :在三维空间内,我们可以假定它占据了 (0,0,0) 到 (x,y,z) 的空间。有魔法的地方在于,这里面是不存在重力的!这样一来,阅读桌就可以漂浮在任何位置。小红书的大家都非常的热爱阅读,特别是在魔法阅读室里!所以,为了搭配魔法阅读室,大家购买了一张魔法阅读桌:这个桌子的体积为 k ,边长可以为任何的正整数。你需要将魔法阅读桌放入魔法阅读室,使得阅读桌的各边平行于对应轴,并且每个角都位于整数坐标上。在所有可能的边长选取情况下,旋转桌子被视为一种方向,找到全部三种方向里摆放方式数量最多的那种情况的数量之和。例如下图中,在 312 的空间里有一张边长为 (2,1,1) 的阅读桌,左右方向有 4 种摆放方式,而竖直方向只有 3 种摆放方式,故我们选取左右方向计入答案。

输入描述

每个测试文件均包含多个测试点。

第一行输入一个整数 T(1≤T≤1000) 代表测试数据组数,每组测试数据描述如下:

第一行输入四个整数 x,y,z 和 k,分别代表魔法阅读室的三边长和魔法阅读桌的体积。

除此之外,保证所有的 x 之和,y 之和以及所有的 z 之和均不超过 1000 。

输出描述

对于每一个测试点,在一行上输出一个整数,代表不同的摆放方式数量。如果无法将魔法阅读桌放入阅读室,那么输出 0。

样例输入

2

3 1 2 2

1 2 3 7

样例输出

4

0

提示:

对于第一个测试点,已经在题目中加以解释。对于第二个测试点,无法将魔法桌放入阅读室。

参考题解

枚举边长i,j,t,保证i<j<t避免重复。不同方向就是把三条边顺序排列组合。边长(a,b,c)在(x,y,z)空间能放的方案数是(x-a+1) * (b-y+1) * (c-z+1)

C++:[此代码未进行大量数据的测试,仅供参考]

#include<cstdio>
#include<iostream>
using namespace std;
int x,y,z,k;
int w(int a,int b,int c)
{
    if (a>x || b>y || c>z) return 0;
    return (x-a+1)*(y-b+1)*(z-c+1);
}
int main()
{
    int T;
    cin>>T;
    while (T--)
    {
        cin>>x>>y>>z>>k;
        if (x>y) swap(x,y);
        if (y>z) swap(y,z);
        if (x>y) swap(x,y);
        long long ans=0;
        for (int i=1; i<=x; i++)
            for (int j=i; j<=y; j++)
            {
                int t=k/i/j;
                if (t<j) break;
                if (i*j*t!=k) continue;
                int s=max(w(t,i,j),w(t,j,i));
                int ss=max(w(i,t,j),w(j,t,i));
                int sss=max(w(i,j,t),w(j,i,t));
                ans+=max(s,max(ss,sss));
            }
        cout<<ans<<endl;
    }
    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import jav

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

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

2 12 评论
分享
牛客网
牛客企业服务