当前位置: 首页 > 面试经验 >

【秋招笔试】9.14红薯秋招(已改编)-三语言题解

优质
小牛编辑
83浏览
2024-09-14

【秋招笔试】9.14红薯秋招(已改编)-三语言题解

大家好这里是 春秋招笔试突围,一起备战大厂笔试

ACM金牌团队️ | 多次AK大厂笔试 | 大厂实习经历

✨ 本系列打算持续跟新 春秋招笔试题

感谢大家的订阅➕ 和 喜欢 和 手里的小花花

✨ 笔试合集传送们 -> 春秋招笔试合集

本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新

题面描述等均已改编,如果和你笔试题看到的题面描述不一样请理解,做法和题目本质基本不变。

感谢各位朋友们的订阅,你们的支持是我们创作的最大动力

小红薯秋招笔试,来啦!!!

本次是异或(疑惑)数学场,第一题和第三题都是考察了了 异或 和 哈希表相关

1️⃣ 哈希表和异或性质的结合

2️⃣ 枚举,很多小伙伴看到范围着么大就不敢写了,其实是可以暴力枚举滴

3️⃣ DFS+哈希表+异或的性质,其实思维难度不大的

01.相似文章配对 评测链接

问题描述

LYA 是一位热爱写作的博主,她经常在社交平台上发布自己的文章。最近,她发现了一个有趣的现象:如果两篇文章的阅读量进行按位异或运算后恰好等于一个特定值 ,那么这两篇文章往往有相似的主题或风格。

现在,LYA 想要统计她所有文章中有多少对相似的文章。她需要你的帮助来完成这个任务。

输入格式

第一行包含两个整数 ,分别表示 LYA 发布的文章总数和判断相似文章的特定值。

第二行包含 个整数 ,表示每篇文章的阅读量。

输出格式

输出一个整数,表示相似文章的对数。

样例输入

5 2
1 3 5 7 9

样例输出

2

数据范围

题解

哈希表

要找出所有满足 的数对 ,其中 表示按位异或运算。

解决这个问题的关键在于利用异或运算的性质。

我们知道,如果 ,那么 。这意味着,对于数组中的每个元素 ,只需要检查 是否也在数组中出现过。

可以使用哈希表来存储每个数字出现的次数。遍历数组时,我们可以直接查询 是否在哈希表中,如果在,就将其出现的次数加到答案中。

参考代码

  • Python
from collections import Counter

# 读取输入
n, k = map(int, input().split())
a = list(map(int, input().split()))

# 初始化计数器和答案
cnt = Counter()
ans = 0

# 遍历数组
for x in a:
    # 统计满足条件的数对
    ans += cnt[x ^ k]
    # 更新当前数字的计数
    cnt[x] += 1

# 输出结果
print(ans)
  • Java
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        // 读取输入
        int n = sc.nextInt();
        int k = sc.nextInt();
        
        // 初始化哈希表和答案
        Map<Integer, Integer> cnt = new HashMap<>();
        long ans = 0;
        
        // 遍历数组
        for (int i = 0; i < n; i++) {
            int x = sc.nextInt();
            // 统计满足条件的数对
            ans += cnt.getOrDefault(x ^ k, 0);
            // 更新当前数字的计数
            cnt.put(x, cnt.getOrDefault(x, 0) + 1);
        }
        
        // 输出结果
        System.out.println(ans);
    }
}
  • Cpp
#include <iostream>
#include <unordered_map>
using namespace std;

int main() {
    int n, k;
    cin >> n >> k;
    
    // 初始化哈希表和答案
    unordered_map<int, int> cnt;
    long long ans = 0;
    
    // 遍历数组
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        // 统计满足条件的数对
        ans += cnt[x ^ k];
        // 更新当前数字的计数
        cnt[x]++;
    }
    
    // 输出结果
    cout << ans << endl;
    return 0;
}

02.魔法书架摆放 评测链接

问题描述

K小姐是一位热爱阅读的魔法师。她最近在自己的魔法塔顶层打造了一个特殊的阅读空间。这个空间是一个长方体,长宽高分别为 。由于K小姐使用了反重力魔法,书架可以悬浮在空中的任何位置。

K小姐新买了一个魔法书架,这个书架的体积为 ,但它可以变形成任何边长为正整数的长方体。K小姐想要将这个书架放入阅读空间,要求书架的各个边要与空间的边平行,并且每个角都要位于整数坐标上。

现在,K小姐想知道在所有可能的书架形状中,最多能有多少种不同的摆放方式。这里,旋转书架被视为一种摆放方向,我们需要找出三种摆放方向中摆放方式最多的那种情况的数量。

输入格式

第一行包含一个整数 ),表示测试数据的组数。

接下来的 行,每行包含四个整数 ),分别表示阅读空间的三个边长和魔法书架的体积。

此外,保证所有测试数据中 的和、 的和以及 的和均不超过

输出格式

对于每组测试数据,输出一行,包含一个整数,表示最多的摆放方式数量。如果无法将魔法书架放入阅读空间,则输出

样例输入

2
3 1 2 2
1 2 3 7

样例输出

4
0

数据范围

  • 所有测试数据中 的和、 的和以及 的和均不超过

题解

枚举

这道题的核心是枚举魔法书架的可能形状,并计算每种形状下的摆放方式数量。

首先,需要理解问题的本质:

  1. 书架的体积是固定的,但可以变形。
  2. 我们需要考虑书架的三种摆放方向。
  3. 对于每种形状,需要计算有多少种不同的摆放位置。

解题思路如下:

  1. 枚举书架的长和宽(设为 )。
  2. 根据体积 计算出高度
  3. 检查这个形状是否合法(高度是否为整数,是否小于等于阅读空间的高度)。
  4. 如果合法,计算这种形状下的摆放方式数量:
  5. 更新最大摆放方式数量。

参考代码

  • Python
def solve():
    # 读取输入
    x, y, z, k = map(int, input().split())
    ans = 0
    
    # 遍历可能的长度
    for i in range(1, x + 1):
        if k % i != 0:
            continue
        # 遍历可能的宽度
        for j in range(1, min(k // i + 1, y + 1)):
            if k % (i * j) == 0:
                # 计算高度
                h = k // (i * j)
                if h > z:
                    continue
                # 更新最大摆放方式数量
                ans = max(ans, (x - i + 1) * (y - j + 1) * (z - h + 1))
    
    # 输出结果
    print(ans)

# 读取测试用例数量
T = int(input())

# 处理每个测试用例
for _ in range(T):
    solve()
  • Java
import java.util.Scanner;

public class Main {
    public static void solve(Scanner sc) {
        // 读取输入
        int x = sc.nextInt();
        int y = sc.nextInt();
        int z = sc.nextInt();
        int k = sc.nextInt();
        int ans = 0;
        
        // 遍历可能的长度
        for (int i = 1; i <= x; i++) {
            if (k % i != 0) {
                continue;
            }
            // 遍历可能的宽度
            for (int j = 1; j <= Math.min(k / i, y); j++) {
                if (k % (i * j) == 0) {
                    // 计算高度
                    int h = k / (i * j);
                    if (h > z) {
                        contin
 类似资料: