虹软科技25届校招笔试算法 A卷

目录
- 1. 第一题
- 2. 第二题
- 3. 论述题
⏰ 时间:2024/08/18
🔄 输入输出:ACM格式
⏳ 时长:2h
本试卷分为不定项选择,编程题,必做论述题和选做论述题,这里只展示编程题和必做论述题,一共三道。
注意,虹软的笔试题目表述的不太清晰,并且也没有给出数据范围,这里针对表述做了一些优化。
1. 第一题
已知字符串 S S S 只包含 A , B A,B A,B 两种字符,设 X X X 为 S S S 中所有 A A A 的索引的集合, Y Y Y 为 S S S 中所有 B B B 的索引的集合。若 S S S 满足以下条件,则称 S S S 为有序字符串。
- X X X 与 Y Y Y 之间存在双射 f f f,满足 ∀ i ∈ X , f ( i ) > i \forall i\in X, f(i)>i ∀i∈X,f(i)>i。
给定有序字符串 S S S,按照下述规则计算 S S S 的分数,设 P , Q P,Q P,Q 分别为有序字符串
- A B AB AB 的分数 = 1 =1 =1
- P Q PQ PQ 的分数 = = = P P P 的分数 + + + Q Q Q 的分数
- A P B APB APB 的分数 = = = 2 ⋅ P 2\cdot P 2⋅P 的分数
输入描述
输入一个仅包含 A , B A,B A,B 的字符串
输出描述
输出一个整数
题解
这道题本来就有些绕,再加上原本的表述不够清晰,所以很容易误解题意,博主这里稍微修改了下表述。
首先来看什么是有序字符串?这里举一个例子。设 S = A A B A A B B B S=AABAABBB S=AABAABBB ,从而 X = { 0 , 1 , 3 , 4 } , Y = { 2 , 5 , 6 , 7 } X=\{0,1,3,4\},\,Y=\{2,5,6,7\} X={0,1,3,4},Y={2,5,6,7}。我们可以找到一个双射
0 → 2 1 → 5 3 → 6 4 → 7 0\to2\\ 1\to 5 \\ 3\to6\\ 4\to 7 0→21→53→64→7
在这个映射下, 2 > 0 , 5 > 1 , 6 > 3 , 7 > 4 2>0,5>1,6>3,7>4 2>0,5>1,6>3,7>4,因此 S S S 是有序的。更通俗地来讲,对于 S S S 中的每一个 A A A,我们都要在 S S S 中找到一个与之配对的 B B B,使得 B B B 的索引大于 A A A 的索引,这样的 S S S 才是有序字符串。
由于双射的性质,易知 ∣ X ∣ = ∣ Y ∣ |X|=|Y| ∣X∣=∣Y∣,因此如果 S S S 是有序的,那么它的长度一定是偶数。此外,一定有 S [ 0 ] = A , S [ − 1 ] = B S[0]=A,\,S[-1]=B S[0]=A,S[−1]=B,即 S S S 的首字符一定是 A A A,尾字符一定是 B B B,若不然,假设 S [ 0 ] = B S[0]=B S[0]=B,我们无法在 S S S 中找到与它配对的 A A A,使得 A A A 的下标小于它,对于 S [ − 1 ] S[-1] S[−1] 同理。设 S S S 的长度为 2 n , n = 1 , 2 , ⋯ 2n,\;n=1,2,\cdots 2n,n=1,2,⋯,易知 n = 1 n=1 n=1 时 S = A B S=AB S=AB,我们称这样的 S S S 为基本串(自己瞎起的名hh,方便后面讲)。
现在回到一般情况,设 S S S 的长度为 2 n 2n 2n, X = { a 1 , a 2 , ⋯ , a n } , Y = { b 1 , b 2 , ⋯ , b n } X=\{a_1,a_2,\cdots,a_n\},\,Y=\{b_1,b_2,\cdots,b_n\} X={a1,a2,⋯,an},Y={b1,b2,⋯,bn}。假设 X , Y X,Y X,Y 均是从左向右统计出来的,从而 X , Y X,Y X,Y 均是有序数组。容易得出以下结论:
S 是有序字符串 ⇔ ∀ i , a i < b i S 是有序字符串 \Leftrightarrow \forall i,\,a_i<b_i S是有序字符串⇔∀i,ai<bi
充分性显然,必要性用反证法证明。
从题中所给的信息,可以猜测,以下两个事件为对立事件(博主还没有来得及证明,欢迎大家在评论区补充):
- S S S 可以拆成两个有序字符串 P , Q P,Q P,Q,即 S = P Q S=PQ S=PQ。且拆法不会影响到 S S S 的分数。
- S S S 可以拆成 A P B APB APB 的形式,其中 P P P 是有序的。
很明显可以用递归来做,每次判断当前的 S S S 属于以上哪一种情况,然后递归进行求解, A B AB AB 的分数为 1 1 1 可以作为递归终止条件。
以 S = A A B A A B B B S=AABAABBB S=AABAABBB 为例。显然 S S S 不能拆成两个有序字符串,因此将其表示成 A P B APB APB 的形式,其中 P = A B A A B B P=ABAABB P=ABAABB 是一定是有序字符串。如果将 P P P 拆成 A R B ARB ARB 的形式,由于 R = B A A B R=BAAB R=BAAB 不是有序的,根据之前的猜想, P P P 一定可以拆成两个有序字符串 U , V U,V U,V,且拆法不会影响到最终分数。很明显 U = A B , V = A A B B U=AB,V=AABB U=AB,V=AABB。于是可以计算 S S S 的分数: S = 2 P = 2 ( U + V ) = 2 ( 1 + 2 ) = 6 S=2P=2(U+V)=2(1+2)=6 S=2P=2(U+V)=2(1+2)=6。
#include <bits/stdc++.h>using namespace std;bool is_ordered(const string& s, int l, int r) {vector<int> a_indices, b_indices;for (int i = l; i < r + 1; i++) {if (s[i] == 'A') a_indices.push_back(i);else b_indices.push_back(i);}if (a_indices.size() != b_indices.size()) return false;for (int i = 0; i < a_indices.size(); i++) {if (a_indices[i] > b_indices[i]) return false;}return true;
}// 计算有序字符串s在闭区间[l, r]上的分数
int score(const string& s, int l, int r) {// 基本串情形if (r - l == 1 && s.substr(l, 2) == "AB") return 1;// 看一下成否拆成PQ,分成[l, i], [i + 1, r]for (int i = l; i < r; i++) {if (is_ordered(s, l, i) && is_ordered(s, i + 1, r)) {// 拆法不会影响分数,直接返回即可return score(s, l, i) + score(s, i + 1, r);}}// 因为是对立事件,所以直接返回return 2 * score(s, l + 1, r - 1);
}int main() {string s;cin >> s;int ans = score(s, 0, s.size() - 1);cout << ans << endl;return 0;
}
后续证明了猜想会在这里补充,也欢迎广大网友补充。
2. 第二题
有红、绿、蓝三种颜色(分别用R、G、B表示)的小球,其数量分别为 a , b , c a,b,c a,b,c。现在想将这些小球排成一列,但不希望相邻的两个小球出现相同颜色,请问有多少种排列方法?
输入描述
第一行为 a 、 b 、 c a、b、c a、b、c 对应的三个数字,以空格隔开
输出描述
输出为排列方法的总数
题解
本题较为简单,dfs即可,从左到右枚举并记录上一次放的什么颜色。
#include <bits/stdc++.h>using namespace std;int dfs(int a, int b, int c, int last) {if (a == 0 && b == 0 && c == 0) return 1;int ans = 0;if (last != 0 && a > 0) {ans += dfs(a - 1, b, c, 0); // 选择红色}if (last != 1 && b > 0) {ans += dfs(a, b - 1, c, 1); // 选择绿色}if (last != 2 && c > 0) {ans += dfs(a, b, c - 1, 2); // 选择蓝色}return ans;
}int main() {int a, b, c;cin >> a >> b >> c;cout << dfs(a, b, c, -1) << endl;return 0;
}
其中 dfs(a, b, c, last)
表示红球有 a a a 个,绿球有 b b b 个,蓝球有 c c c 个,且上一次放置的是 last
颜色的情况下,能够放置的方法总数。初始时没有放置,故 last == -1
。
考虑边界条件。例如只有一个红球的情况下,此时放置方案只有一种,因此
1 = d f s ( 1 , 0 , 0 , − 1 ) = d f s ( 0 , 0 , 0 , 0 ) 1=dfs(1,0,0,-1)=dfs(0,0,0,0) 1=dfs(1,0,0,−1)=dfs(0,0,0,0)
故可知边界条件 d f s ( 0 , 0 , 0 , l a s t ) = 1 dfs(0,0,0,last)=1 dfs(0,0,0,last)=1。
3. 论述题
假设有一张宽为 M M M,高为 N N N 的黑白图像,每个元素都是 0 0 0 或 1 1 1,其中 0 0 0 表示黑色像素, 1 1 1 表示白色像素,要在该图像中找到一个宽为 W W W,高为 H H H 的矩形子区域( W < M , H < N W<M,H<N W<M,H<N 且已知),使得该区域内的白色像素数最多,并计算该区域内的白色像素数。
注意 O ( M N H W ) O(MNHW) O(MNHW) 的实现不计分,请用文字描述或者伪代码说明算法过程,并分析时间复杂度。
题解
容易知道枚举所有子矩形的时间复杂度为 O ( ( M − W + 1 ) ⋅ ( N − H + 1 ) ) O((M-W+1)\cdot(N-H+1)) O((M−W+1)⋅(N−H+1))。
计算子矩形中的白色像素数等价于计算子矩形中的所有元素和。
如果暴力求解的话,即每次枚举的时候都计算一遍元素和,那么总时间复杂度为 O ( W H ⋅ ( M − W + 1 ) ⋅ ( N − H + 1 ) ) = O ( W H M N ) O(WH\cdot(M-W+1)\cdot(N-H+1))=O(WHMN) O(WH⋅(M−W+1)⋅(N−H+1))=O(WHMN),不符合题意。
求区域的元素和可以使用「二维前缀和」算法,我们可以在 O ( M N ) O(MN) O(MN) 的时间内预处理出一个前缀和数组,然后每次枚举的时候只需要在 O ( 1 ) O(1) O(1) 的时间内就能算出子矩形的所有元素和,此时总时间复杂度为
O ( M N + ( M − W + 1 ) ⋅ ( N − H + 1 ) ) O(MN+(M-W+1)\cdot(N-H+1)) O(MN+(M−W+1)⋅(N−H+1))
相关文章:

虹软科技25届校招笔试算法 A卷
目录 1. 第一题2. 第二题3. 论述题 ⏰ 时间:2024/08/18 🔄 输入输出:ACM格式 ⏳ 时长:2h 本试卷分为不定项选择,编程题,必做论述题和选做论述题,这里只展示编程题和必做论述题,一共三…...

C++ | Leetcode C++题解之第345题反转字符串中的元音字母
题目: 题解: class Solution { public:string reverseVowels(string s) {auto isVowel [vowels "aeiouAEIOU"s](char ch) {return vowels.find(ch) ! string::npos;};int n s.size();int i 0, j n - 1;while (i < j) {while (i < …...

Kubernetes拉取阿里云的私人镜像
前提条件 登录到阿里云控制台 拥有阿里云的ACR服务 创建一个命名空间 获取仓库的访问凭证(可以设置固定密码) 例如 sudo docker login --usernameyourAliyunAccount registry.cn-guangzhou.aliyuncs.com 在K8s集群中创建一个secret 使用kubectl命令行…...

Leetcode每日刷题之118.杨辉三角
1.题目解析 杨辉三角作为一个经典的数学模型,其基本原理相信大家已经耳熟能详,这里主要是在学习了vector之后,对于本题有了新的解法,更加简便。关于vector的基本使用详见 面向对象程序设计(C)之 vector(初阶࿰…...

【ARM 芯片 安全与攻击 5.2 -- 芯片中侧信道攻击与防御方法介绍】
文章目录 什么是 Speculation Barriers?如何使用 Speculation Barriers?什么是 PAN?如何启用 PAN?使用 PAN 保护操作系统Spectre 攻击防御示例Meltdown 攻击防御示例Summary什么是 Speculation Barriers? Speculation Barriers,是一种防止处理器在投机执行中泄漏敏感信息…...

XSS-games
XSS 1.XSS 漏洞简介2.XSS的原理3.XSS的攻击方式4.XSS-GAMESMa SpaghetJefffUgandan KnucklesRicardo MilosAh Thats HawtLigmaMafiaOk, BoomerWW3svg 1.XSS 漏洞简介 XSS又叫CSS(Cross Site Script)跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Sc…...

日撸Java三百行(day25:栈实现二叉树深度遍历之中序遍历)
目录 一、栈实现二叉树遍历的可行性 二、由递归推出栈如何实现中序遍历 1.左子树入栈 2.根结点出栈 3.右子树入栈 4.实例说明 三、代码实现 总结 一、栈实现二叉树遍历的可行性 在日撸Java三百行(day16:递归)中,我们讲过…...

【vue讲解:ref属性、动态组件、插槽、vue-cli创建项目、vue项目目录介绍、vue项目开发规范、es6导入导出语法】
0 ref属性(组件间通信) # 1 ref属性放在普通标签上<input type"text" v-model"name" ref"myinput">通过 this.$refs[myinput] 拿到的是 原生dom对象操作dom对象:改值,换属性。。。# 2 ref属…...

ubuntu:最新安装使用docker
前言 系统:ubuntu 22.04 desktop 目的:安装使用docker 安装小猫猫 没有安装包的,可以自己去瞅瞅,这里不提供下载方式 sudo dpkg -i ./cat-verge_1.7.5_amd64.deb 在应用里,打开这个软件,并开启系统猫猫 配…...

Linux ssh 免密失效
sudo chmod -R 777 /home/xxx sudo chown -R xxx:xxx /home/xxx 为什么我输入这两条指令后,ssh免密失效了? 当你使用 sudo chmod -R 777 /home/xxx 和 sudo chown -R xxx:xxx /home/xxx 这两条指令后,可能会导致 SSH 免密登录失效的原因有以…...

k8s上部署ingress-controller
一、安装helm仓库 # helm pull ingress-nginx/ingress-nginx 二、修改 三、运行 # kubectl label nodes node01.110111.cn ingresstrue# kubectl label nodes node02.110112.cn ingresstrue# helm upgrade --install ingress-nginx -n ingress-nginx . -f values.yaml 四、检…...

Android 13 about launcher3 (1)
Android 13 Launcher3 android13#launcher3#分屏相关 Launcher3修改 wm density界面布局不改变 /packages/apps/Launcher3/src/com/android/launcher3/InvariantDeviceProfile.java Launcher的默认配置加载类,通过InvariantDeviceProfile方法可以看出,…...

服务器数据恢复—raid5阵列热备盘未全部启用导致阵列崩溃的数据恢复案例
服务器存储数据恢复环境: 一台EMC某型号存储中有一组RAID5磁盘阵列。该raid5阵列中有12块硬盘,其中2块硬盘为热备盘。 服务器存储故障: 该存储raid5阵列中有两块硬盘离线,只有1块热备盘启用替换掉其中一块离线盘,另外…...

HTML—css
css概述 C S S 是 C a s c a d i n g S t y l e S h e e t s ( 级 联 样 式 表 ) 。 C S S 是 一 种 样 式 表 语 言 , 用 于 为 H T M L 文 档 控 制 外 观 , 定 义 布 局 。 例 如 , C S S 涉 及 字 体 、 颜 色 、…...

IO多路复用(Input/Output Multiplexing)
IO多路复用(Input/Output Multiplexing) 是一种在单个线程中管理多个输入/输出通道的技术。它允许一个线程同时监听多个输入流(如网络套接字、文件描述符等),并在有数据可读或可写时进行相应的处理,而不需要为每个通道创建一个独立的线程。这种技术主要用于处理并发连接…...

android与pc 用socket无线通信
今天做一个android与pc通信的小demo(不是wifi,蓝牙)android为客户端,pc为服务器(一对多)。pc代码很简单,android客户端代码也不难,但是有一点不太明白就是在客户端向服务器发送消息时…...

【流程引擎】springboot完美集成activiti工作流方案
前言 activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。 项目源码配套文档获取:本文末个人名片直接获取。 一、项目形式 springboot…...

11、常见API
01、String类概述及构造方法简介 一、字符串 由多个字符组成的一串数据 二、简介 String类代表的是一个字符串。字符串对象在开发中是最常见的。为了方便我们对字符串进行操作,java就把字符串用对象进行了封装,这个封装就是String类 三、String类的构造方…...

渗透第三次作业
目录 第一关Ma Spaghet! 第二关Jefff: 第三关:Ugandan Knuckles 第四关:Ricardo Milos 第五关: Ah Thats Hawt 第一关Ma Spaghet! <h2 id"spaghet"></h2> <script>spaghet.innerHTML (new URL(…...

Python自动化:解锁高效工作与生产力的密钥
在当今快节奏的数字时代,自动化已成为提升工作效率、优化流程、减少人为错误的不可或缺的工具。Python,作为一种功能强大、易于学习且应用广泛的编程语言,在自动化领域扮演着举足轻重的角色。无论是数据处理、Web自动化、软件测试,…...

Sentinel1.8.1 控制台改造
Sentinel 控制台是流量控制、熔断降级规则统一配置和管理的入口,它为用户提供了机器自发现、簇点链路自发现、监控、规则配置等功能。在 Sentinel 控制台上,我们可以配置规则并实时查看流量控制效果。 本项目是在Sentinel控制台1.8.1的基础上改造的&…...

设计模式(2)行为型模式和七大原则
1、目标 本文的主要目标是学习设计模式的行为型模式并举例说明 2、行为型模式 2.1 观察者模式(Observer) 观察者模式是对象之间存在一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会得到通知并自动更新&…...

学懂C++(三十一):高级教程——深入详解C++高级多线程编程技术之锁优化与替代
引言 随着多核处理器的普及,多线程编程技术已经成为提高应用程序性能的关键手段。在多线程环境下,如何高效、安全地管理线程之间的共享资源是开发者面临的主要挑战。传统的锁机制,如互斥锁(Mutex)、临界区(…...

Linux - 基础工具使用
文章目录 一、yum1、介绍2、功能3、语法4、使用 二、rzsz1、安装rzsz的指令2、介绍3、使用 三、vim基础使用1、介绍2、基础使用 四、gcc/g使用1、生成可执行文件过程2、语法3、常用选项4、编译过程5、动静态库6、包含头文件的多文件编译7、链接外部库 一、yum 1、介绍 Linux中…...

理解线程id和简单封装原生线程库
一、理解线程id 首先我们要知道给用户提供的线程id不是内核里面LWP(轻量级进程id),而是pthread库自己维护的一个唯一值。 我们理解为什么线程id不是内核里面LWP,因为用户没有权限使用内核里面的字段,那是专门给OS管理…...

Unified 阻抗控制 architecture、framework、approach
Unified 阻抗控制(Unified Impedance Control)作为一种控制策略,其architecture(架构)、framework(框架)和approach(方法)为: 一、Unified 阻抗控制 Archite…...

Java后端面试题(mq相关)(day9)
目录 为什么用MQ? 异步 、削峰、解耦1. 异步处理2. 解耦3. 削峰填谷 Exchange类型什么是死信队列?如何保证消息的可靠性?RabbitMQ中如何解决消息堆积问题?RabbitMQ中如何保证消息有序性?如何防止消息重复消费?(如何保证消息幂等…...

算法-华为OD机试-识别有效的IP地址和掩码并进行分类统计
1.描述 见牛客网 https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a74356822. 分析 根据题目要求,分为以下几步 1. 提取IP地址和子网掩码 我们首先需要拆分输入的每一行,分别提取IP地址和子网掩码,并检查它们的合法性。 2.…...

钉钉开发网页应用JSAPI前端授权鉴权nodejs实现
钉钉开发网页应用JSAPI前端授权鉴权nodejs实现 使用钉钉进行H5网页开发的时候,需要调用一些钉钉提供具有原生能力的api,要调用这些api需要进行jsapi授权。 详见官方文档(可选)开发网页应用前端 - 钉钉开放平台 (dingtalk.com) 官方…...

uniapp 自定义全局弹窗
自定义全局弹窗可在js和.vue文件中调用,unipop样式不满足,需自定义样式。 效果图 目录结构 index.vue <template><view class"uni-popup" v-if"isShow"><view class"uni-popup__mask uni-center ani uni-cust…...