阿里国际2025届校园招聘 0826算法岗笔试

目录

  • 1. 第一题
  • 2. 第二题
  • 3. 第三题

⏰ 时间:2024/08/26
🔄 输入输出:ACM格式
⏳ 时长:100min

本试卷分为单选,多选,编程三部分,这里只展示编程题。

1. 第一题

题目描述

小红有一个大小为 n × n n \times n n×n 的 01 矩阵,小红每次操作可以选择矩阵的一个元素进行反置。小红想知道,最少需要多少次操作,可以让矩阵变成一个单位矩阵,即只有主对角线上有 1,其他位置都是 0(即形如:

[ 1 0 ⋯ 0 0 1 ⋯ 0 ⋮ ⋮ ⋱ ⋮ 0 0 ⋯ 1 ] \begin{bmatrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \\ \end{bmatrix} 100010001

)。请你帮助小红解决这个问题。

若当前数字为 0,反置后为 1;若当前数字为 1,翻转后为 0

输入描述

第一行输入一个整数 n n n,表示矩阵的大小 ( 1 ≤ n ≤ 1000 ) (1 \leq n \leq 1000) (1n1000)
此后 n n n 行,第 i i i 行输入 n n n 个整数 a i , 1 , a i , 2 , … , a i , n a_{i,1}, a_{i,2}, \dots, a_{i,n} ai,1,ai,2,,ai,n,表示矩阵中第 i i i 行第 j j j 列的元素 ( a i , j = 0  或  1 ) (a_{i,j} = 0 \text{ 或 } 1) (ai,j=0  1)

输出描述

在一行上输出一个整数,代表最少需要多少次操作。

题解

模拟即可。

#include <bits/stdc++.h>

using namespace std;

int main() {
    int N;
    cin >> N;
    int ans = 0;
    
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            int x;
            cin >> x;
            if (i == j) {
                if (x != 1) ans++;
            } else {
                if (x != 0) ans++;
            }
        }
    }
    
    cout << ans << endl;
    return 0;
}

2. 第二题

题目描述

小红定义 f ( x ) f(x) f(x) 表示数字 x x x 的因子个数,例如 f ( 6 ) = 4 f(6) = 4 f(6)=4(6 的因子有 1 , 2 , 3 , 6 1, 2, 3, 6 1,2,3,6)。

认为一个完美三元组 ( i , j , k ) (i, j, k) (i,j,k) ( 1 ≤ i < j < k ≤ n ) (1 \leq i < j < k \leq n) (1i<j<kn) 需要满足: f ( a i ) − f ( a j ) = f ( a k ) f(a_i) - f(a_j) = f(a_k) f(ai)f(aj)=f(ak)

小红给你一个长度为 n n n 的数组 a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,,an,请你帮助她求出有多少个不同的完美三元组。

当完美三元组中存在在一个位置数字不同,即认为是不同的方案。例如: ( 1 , 2 , 3 ) (1, 2, 3) (1,2,3) ( 1 , 2 , 4 ) (1, 2, 4) (1,2,4) 为两种方案。

输入描述

第一行输入一个整数 n n n ( 3 ≤ n ≤ 1 0 5 ) (3 \leq n \leq 10^5) (3n105),代表数组中的元素数量。
第二行输入 n n n 个数字 a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,,an ( 1 ≤ a i ≤ 1 0 6 ) (1 \leq a_i \leq 10^6) (1ai106) 表示数组元素。

输出描述

在一行上输出一个整数,代表三元组数量。

题解

给定范围 a i ≤ 1 0 6 a_i \leq 10^6 ai106,可以预计算所有数字 1 1 1 1 0 6 10^6 106 的因子个数,这可以通过简单的整除操作来实现。具体地,对于每个整数 i i i,将其倍数的因子个数递增,即 divisor_count [ j ] + = 1 \text{divisor\_count}[j] += 1 divisor_count[j]+=1,其中 j j j i i i 的倍数。在获取了所有元素的因子个数后,问题可以转化为在数组中寻找满足 f ( a i ) − f ( a j ) = f ( a k ) f(a_i) - f(a_j) = f(a_k) f(ai)f(aj)=f(ak) 的三元组。使用两次遍历来分割问题,将当前位置 j j j 的左侧部分视为前缀,右侧部分视为后缀。分别用计数数组来记录前缀和后缀中因子个数的频率。

对于每个位置 j j j,更新右侧部分的计数,移除当前元素的计数,并遍历所有可能的 f ( a i ) f(a_i) f(ai) 值来验证是否存在满足条件的 f ( a k ) f(a_k) f(ak)。具体来说,对于每个前缀中的 f ( a i ) f(a_i) f(ai),计算 f ( a k ) = f ( a i ) − f ( a j ) f(a_k) = f(a_i) - f(a_j) f(ak)=f(ai)f(aj),并检查后缀中是否存在该值。如果存在,将前缀中 f ( a i ) f(a_i) f(ai) 的数量与后缀中 f ( a k ) f(a_k) f(ak) 的数量相乘,并将结果加到总计数中。

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

const int MAX_N = 1e5 + 5;
const int MAX_A = 1e6 + 5;
const int MAX_DIVISORS = 240 + 5;

int n;
vector<int> numbers;
vector<int> divisor_count(MAX_A, 0);        // 约数个数表
vector<int> divisor_counts;                 // 输入数组中每个元素的约数个数
vector<int> prefix_counts(MAX_DIVISORS, 0); // 前缀中约数个数的计数
vector<int> suffix_counts(MAX_DIVISORS, 0); // 后缀中约数个数的计数

// 预计算每个数的约数个数
void compute_divisors() {
    for (int i = 1; i < MAX_A; ++i) {
        for (int j = i; j < MAX_A; j += i) {
            divisor_count[j]++;
        }
    }
}

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

    compute_divisors();

    cin >> n;
    numbers.resize(n);
    divisor_counts.resize(n);
    unordered_map<int, int> total_counts; // 统计每种约数个数的总数

    for (int i = 0; i < n; ++i) {
        cin >> numbers[i];
        divisor_counts[i] = divisor_count[numbers[i]];
        total_counts[divisor_counts[i]]++;
    }

    for (int d = 1; d < MAX_DIVISORS; ++d) {
        suffix_counts[d] = total_counts[d];
    }

    i64 total_triplets = 0;
    for (int j = 0; j < n; ++j) {
        int div_count_j = divisor_counts[j];
        suffix_counts[div_count_j]--;

        // 枚举可能的 div_count_i
        for (int div_count_i = 1; div_count_i < MAX_DIVISORS; ++div_count_i) {
            if (prefix_counts[div_count_i] > 0) {
                int div_count_k = div_count_i - div_count_j;
                if (div_count_k >= 1 && div_count_k < MAX_DIVISORS) {
                    if (suffix_counts[div_count_k] > 0) {
                        total_triplets += (i64)prefix_counts[div_count_i] * suffix_counts[div_count_k];
                    }
                }
            }
        }

        prefix_counts[div_count_j]++;
    }

    cout << total_triplets << endl;

    return 0;
}

3. 第三题

题目描述

小红有一个六边形形状的 01 字符串生成器,一共有 A , B , C , D , E , F A, B, C, D, E, F A,B,C,D,E,F 六个部分,每一个部分初始会随机生成一个状态 0 0 0 1 1 1,随后,按照 A , B , C , D , E , F A, B, C, D, E, F A,B,C,D,E,F 的顺序形成一个 01 字符串,然后显示在蓝色部分的屏幕上。

初始时,小红随机让生成器生成了一个字符串 S S S,但这个并不是小红喜欢的,所以她想将 S S S 变成目标串 T T T。为此,每次她可以执行以下操作之一:

  • A A A 的状态取反,但该操作会同步把 B B B F F F 的状态取反;
  • B B B 的状态取反,但该操作会同步把 A A A C C C 的状态取反;
  • C C C 的状态取反,但该操作会同步把 B B B D D D 的状态取反;
  • D D D 的状态取反,但该操作会同步把 C C C E E E 的状态取反;
  • E E E 的状态取反,但该操作会同步把 D D D F F F 的状态取反;
  • F F F 的状态取反,但该操作会同步把 E E E A A A 的状态取反。

小红想知道,要将 S S S 变成 T T T 至少需要执行几次操作。

注意:若当前字符为 0,取反后为 1;若当前字符为 1,取反后为 0

输入描述

每个测试文件中包含多组测试数据。

第一行输入一个整数 T T T ( 1 ≤ T ≤ 1 0 5 ) (1 \leq T \leq 10^5) (1T105),代表数据组数,每组测试数据描述如下:

  • 第一行输入一个长度为 6 6 6 且只由 0 0 0 1 1 1 构成的字符串 S S S,代表初始串。
  • 第二行输入一个长度为 6 6 6 且只由 0 0 0 1 1 1 构成的字符串 T T T,代表目标串。

输出描述

对于每一组测试数据,在一行上输出一个整数,代表把 S S S 变为 T T T 的最小操作次数;如果无法变成目标串,则直接输出 -1

题解

考虑采用BFS的方法。BFS适合用于寻找无权图中最短路径的情况,这里每个状态都可以视为图中的一个节点,而每次操作产生的新状态则构成与当前状态的边。我们需要记录已经访问过的状态,以避免重复计算和无效循环。

在具体实现中,我们首先检查初始状态 S S S 是否已经等于目标状态 T T T,如果相等,则无需任何操作,返回 0 0 0。接下来,将初始状态入队,设定操作计数为 0 0 0,并维护一个哈希表以标记访问过的状态。然后,进行状态转移,对于当前状态的每一种操作,通过取反相应的部分生成新的状态,并检查是否已达到目标状态。如果达到了目标状态,则返回当前操作计数加一。如果未达到,且该状态未被访问,则将其入队并继续探索。

如果在遍历所有可能的状态后仍未找到目标状态,则返回 − 1 -1 1,表示无法通过有效的操作将 S S S 转换为 T T T

#include <bits/stdc++.h>

using namespace std;

vector<vector<int>> ops = {
    {0, 1, 5},
    {0, 1, 2},
    {1, 2, 3},
    {2, 3, 4},
    {3, 4, 5},
    {0, 4, 5}
};

string flip(const string& s, const vector<int>& positions) {
    string result = s;
    for (int pos : positions) {
        result[pos] = (result[pos] == '0') ? '1' : '0';
    }
    return result;
}

int bfs(const string& start, const string& target) {
    if (start == target) return 0;
    
    queue<pair<string, int>> q;
    unordered_map<string, bool> visited;

    q.push({start, 0});
    visited[start] = true;

    while (!q.empty()) {
        auto [current, steps] = q.front();
        q.pop();

        for (const auto& op : ops) {
            string next = flip(current, op);
            if (next == target) return steps + 1;
            if (!visited[next]) {
                visited[next] = true;
                q.push({next, steps + 1});
            }
        }
    }

    return -1;
}

int main() {
    int T;
    cin >> T;
    while (T--) {
        string S, T;
        cin >> S >> T;
        cout << bfs(S, T) << endl;
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/906618.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

goframe开发一个企业网站 模版界面5

html或者说是模板的控制 以下是是系统的设置 server:address: ":8000"serverRoot: "resource/public" #这里要加上&#xff0c;为以后的静态文件的引入准备openapiPath: "/api.json"swaggerPath: "/swagger"cookieMaxAge: "365…

适配器模式:类适配器与对象适配器

适配器模式是一种结构性设计模式&#xff0c;旨在将一个接口转换成客户端所期望的另一种接口。它通常用于解决由于接口不兼容而导致的类之间的通信问题。适配器模式主要有两种实现方式&#xff1a;类适配器和对象适配器。下面&#xff0c;我们将详细探讨这两种方式的优缺点及适…

如何在Linux系统中使用Ansible进行自动化部署

如何在Linux系统中使用Ansible进行自动化部署 Ansible简介 安装Ansible 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 Ansible的基本概念 Inventory文件 Playbooks Modules 创建Inventory文件 编写第一个Playbook 创建Playbook文件 运行Playbook 使用Handlers 编写包…

Spring Boot 3.x 整合 Druid 数据库连接池(含密码加密)

Spring Boot 3.x 整合 Druid 数据库连接池&#xff08;含密码加密&#xff09; 1. 为什么需要数据库连接池&#xff1f; 在传统的数据库连接中&#xff0c;每一次与数据库连接都会消耗大量的系统资源和时间。数据库连接池会提前创建一定数量的数据库连接保存在池中&#xff0…

【论文#码率控制】Rate Control for H.264 Video With Enhanced Rate and Distortion Models

目录 摘要1.前言2.编码器框架3.增强RD模型3.1 头部比特的速率模型3.2 源比特的码率模型3.3 失真模型3.4 块类型的确定 4.面向H264 Baseline Profile的码率控制算法5.实验结果6.结论和未来工作 《Rate Control for H.264 Video With Enhanced Rate and Distortion Models》 Auth…

vue和django接口联调

vue访问服务端接口 配置跨域 前端跨域 打开vite.config.js&#xff0c;在和resolve同级的地方添加配置。 proxy代表代理的意思 "/api"是以/api开头的路径走这个配置 target代表目标 changeOrigin: true,是开启跨域请求 rewrite是编辑路径。 (path) > pa…

HTML鼠标移动的波浪线动画——页面将会初始化一个Canvas元素,并使用JavaScript代码在Canvas上绘制响应鼠标移动的波浪线动画

代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Wave Animation</title><style&…

玩转Docker | Docker基础入门与常用命令指南

玩转Docker | Docker基础入门与常用命令指南 引言基本概念help帮助信息常用命令管理镜像运行容器构建镜像其他Docker命令整理结语引言 Docker 是一种开源的应用容器引擎,它允许开发者将应用程序及其依赖打包进一个可移植的容器中,然后发布到任何流行的 Linux 机器上。这大大简…

信息学科平台设计与实现:Spring Boot技术详解

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

现代化水电管理:Spring Boot在大学城的实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Rust 力扣 - 289. 生命游戏

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们记录上一行和当前行转换之后的状态&#xff0c;当前行转换之后的状态计算完毕后调整上一行状态&#xff0c;直至最后一行状态计算完毕后调整最后一行状态 题解代码 pub fn game_of_life(board: &mut V…

015:地理信息系统开发平台ArcGIS Engine10.2与ArcGIS SDK for the Microsoft .NET Framework安装教程

摘要&#xff1a;本文详细介绍地理信息系统开发平台ArcGIS Engine10.2与ArcGIS SDK for the Microsoft .NET Framework的安装流程。 一、软件介绍 ArcGIS Engine 10.2是由Esri公司开发的一款强大的GIS&#xff08;地理信息系统&#xff09;开发平台。该软件基于ArcGIS 10.2 fo…

如何进行PDF高效合并?盘点11款PDF编辑器给你

是不是经常觉得烦&#xff1a;一个PDF文件特别长&#xff0c;里面好多章节或者报告&#xff0c;每次要看或者给别人发都得翻半天&#xff1f;别担心&#xff0c;今天我就来教你们几个合并PDF的小技巧&#xff0c;保证让你在2024年变成整理文件的高手&#xff01; 1、福昕PDF文…

PPT素材、模板免费下载!

做PPT一定要收藏好这6个网站&#xff0c;PPT模板、素材、图表、背景等超多素材全部免费下载。 1、菜鸟图库 ppt模板免费下载|ppt背景图片 - 菜鸟图库 菜鸟图库网有非常丰富的免费素材&#xff0c;像设计类、办公类、自媒体类等素材都很丰富。PPT模板种类很多&#xff0c;全部都…

Cpp二叉搜索树的讲解与实现(21)

文章目录 前言一、二叉搜索树的概念定义特点 二、二叉树的实现基本框架查找插入删除当只有0 ~ 1个孩子的时候当有2个孩子的时候 三、二叉树的应用K模型KV模型 四、二叉树的性能分析总结 前言 这是全新的一个篇章呢&#xff0c;二叉搜索树是我们接下来学习set、map的前提 迈过它…

群控系统服务端开发模式-应用开发-菜单功能开发

为什么优先开发菜单&#xff0c;而不是优先开发管理员&#xff1f;查看一下程序草图就明白&#xff0c;还有一个重点就是&#xff0c;管理员需要添加图片&#xff0c;而我还没有封装上传工具及上传目标。 一、添加路由 在根目录下route文件夹下的app.php文件里面&#xff0c;添…

2024年,Rust开发语言,现在怎么样了?

Rust开发语言有着一些其他语言明显的优势&#xff0c;但也充满着争议&#xff0c;难上手、学习陡峭等。 Rust 是由 Mozilla 主导开发的通用、编译型编程语言&#xff0c;2010年首次公开。 在 Stack Overflow 的年度开发者调查报告中&#xff0c;Rust 连续多年被评为“最受喜爱…

c# 值类型

目录 1、c#类型2、值类型2.1 结构体2.2 枚举 1、c#类型 类型&#xff08;Type&#xff09;又叫数据类型&#xff08;Data Type&#xff09;。 A data type is a homogeneous collection of values,effectively prensented,equipped with a set of operations which manipulate…

怒刷666条提示词后,终于总结出终结 AI 味儿的3种方法(强烈建议收藏)

大家好&#xff0c;我是凡人。 最近一个朋友给我发了几张他知乎的评论&#xff0c;是这样的&#xff1a; 这样的&#xff1a; 还有这样的&#xff1a; 无奈他就问我 “ AI 怎么能生成没有 AI味儿 的回答&#xff1f;” &#xff0c;说实话这真是个神奇的问题。 老话儿讲 “ 耳…

Angular实现gridview效果

说明&#xff1a;使用angular实现grid效果&#xff0c;支持文字图片多条数据展示 效果图: step1: <mat-grid-list cols"2" rowHeight"2:1"><mat-grid-tile *ngFor"let course of courses">{{ course }}</mat-grid-tile> &l…