华为OD机考试题

135 阅读9分钟

1 静态代码扫描服务

题目描述:
静态扫描快速快速识别源代码的缺陷,静态扫描的结果以扫描报告作为输出:
1、文件扫描的成本和文件大小相关,如果文件大小为N,则扫描成本为N个金币
2、扫描报告的缓存成本和文件大小无关,每缓存一个报告需要M个金币
3、扫描报告缓存后,后继再碰到该文件则不需要扫描成本,直接获取缓存结果
给出源代码文件标识序列和文件大小序列,求解采用合理的缓存策略,最少需要的金币数。

输入描述:
第一行为缓存一个报告金币数M,1<=M<=100
第二行为文件标识序列:F1,F2,F3...Fn,  其中 1<=N<=10000, 1<=Fi<=1000
第三行为文件大小序列:S1,S2,S3...Sn, 其中 1<=N<=10000, 1<=Si<=10

输出描述:
采用合理的缓存策略,需要的最少金币数
补充说明:

示例1
输入:
5
1 2 2 1 2 3 4
1 1 1 1 1 1 1
输出:
7
说明:
文件大小相同,扫描成本均为1个金币。缓存任意文件均不合算,因而最少成本为7金币
示例2
输入:
5
2 2 2 2 2 5 2 2 2 
3 3 3 3 3 1 3 3 3
输出:
9
说明:
2号文件出现了8次,扫描加缓存成本共计3+5=8,不缓存成本为3*8=24,显然缓存更优。最优最成本为8+1=9

2 学校的位置

题目描述:
为了解决新学期学生暴涨的问题,小乐村要建所新学校。考虑到学生上学安全问题,需要所有学生家到学校距离最短。假设学校和所有的学生家,走在一条直线上。 请问,学校要建在什么位置,能使得学校到各个学生家的距离之和最短?
输入描述:输入的第一行是一个整数N(1<=N<=1000),表示有N户家庭。
输入的第二行是一个属组 (0<= <=10000),表示每户家庭的位置,所有家庭的位置都不相同。
输出描述:输出一行,一个整数,表示你确定的学校位置。如有多个位置相同,则输出值最小的位置。

示例1
输入:
5
0 20 40 10 30
输出:
20
说明:
20到各个家庭的距离分别为 20 0 20 10 10,总和为 60,最小。
示例2
输入:
1
20
输出:
20
说明:
只有一组数据,20 到 20 距离最小,为 0。
示例3
输入:
2
0 20
输出:
0
说明:
虽然,有多个地方可以选,但是 0 数值最小。

3 网上商城优惠活动

题目描述:
【背景】
某网上商城举办优惠活动,发布了满减、打折、无门槛3种优惠券,分别为:
1.每满100元优惠10元,无使用数限制,如100~199元可以使用1张减10元,200~299可使用2张减20元,以此类推;
2.92折券,1次限使用1张,如100元,则优惠后为92元;
3.无门槛5元优惠券,无使用数限制,直接减5元。
【优惠券使用限制】
每次最多使用2种优惠券,2种优惠可以叠加(优惠叠加时以优惠后的价格计算),以购物200元为例,可以先用92折券优惠到184元,再用1张满减券优惠10元,最终价格是174元,也可以用满减券2张优惠20元为180元,再使用92折券优惠到165165.6向下取整)元,不同使用顺序的优惠价格不同,以最优惠价格为准。在一次购物中,同一类型优惠券使用多张时必须一次性使用,不能分多次拆开穿插使用(不允许先使用1张满减券,再用打折券,再使用一张满减券)。
【问题】
请设计实现一种解决方法,帮助购物者以最少的优惠券获得最优的优惠价格。优惠后价格越低越好,同等优惠价格,使用的优惠券越少越好,可以允许某次购物不使用优惠券。
【约定】
优惠活动每人只能参加一次,每个人的优惠券种类和数量是一样的。
输入描述:
第一行:每个人拥有的优惠券数量(数量取值范围为[0, 10]),按满减、打折、无门槛的顺序输入。
第二行:表示购物的人数n(1 <= n <= 10000)。
最后n行:每一行表示某个人优惠前的购物总价格(价格取值范围(0, 1000],都为整数)。
约定:输入都是符合题目设定的要求的。
输出描述:
每行输出每个人每次购物优惠后的最低价格以及使用的优惠券总数量,每行的输出顺序和输入的顺序保持一致。
补充说明:
1.优惠券数量都为整数,取值范围为[0, 10]2.购物人数为整数,取值范围为[1, 10000]3.优惠券的购物总价为整数,取值范围为(0, 1000]。
4.优惠后价格如果是小数,则向下取整,输出都为整数。

示例1
输入:
3 2 5
3
100
200
400
输出:
65 6
155 7
338 4
说明:
【输入说明】
第一行:3种优惠券数量分别为满减券3张,打折券2张,无门槛5张
第二行:总共3个人购物
第三行:第一个人购物优惠前价格为100元
第四行:第二个人购物优惠前价格为200元
第五行:第三个人购物优惠前价格为400元
【输出说明】
输入3个人,输出3行结果,同输入的顺序,对应每个人的优惠结果,如下:
第一行:先使用1张满减券优惠到90元,再使用5张无门槛券优惠25元,最终价格是65元,总共使用6张优惠券
第二行:先使用2张满减券优惠到180元,再使用5张无门槛券优惠25元,最终价格是155元,总共使用7张优惠券
第三行:先使用192折券优惠到368元,再使用3张满减券优惠30元,最终价格是338元,总共使用4张优惠券

4 相同数字的积木游戏

题目描述:
小华和小薇一起通过玩积木游戏学习数学。
他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同。
小华随机拿一些积木挨着排成一排,请小薇找到这排积木中数字相同且所处位置最远的2块积木块,计算他们的距离。
小薇请你帮忙替解决这个问题。

输入描述:
第一行输入为N,表示小华排成一排的积木总数。

接下来N行每行一个数字,表示小华排成一排的积木上数字。

输出描述:
相同数字的积木的位置最远距离;
如果所有积木数字都不相同,请返回-1.
补充说明:
0<=积木上的数字<10^9
1<=积木长度<=10^5

示例1
输入:
5
1
2
3
1
4
输出:
3
说明:
一共有5个积木,第1个积木和第4个积木数字相同,其距离为3;
示例2
输入:
2
1
2
输出:
-1
说明:
一共有2个积木,没有积木数字相同,返回-1;

5 字符串解密

题目描述:
    给定两个字符串string1和string2。
    string1是一个被加扰的字符串。string1由小写英文字母('a'~'z')和数字字符('0'~'9')组成,而加扰字符串由'0'~'9''a'~'f'组成。string1里面可能包含0个或多个加扰子串,剩下可能有0个或多个有效子串,这些有效子串被加扰子串隔开。
    string2是一个参考字符串,仅由小写英文字母('a'~'z')组成。
    你需要在string1字符串里找到一个有效子串,这个有效子串要同时满足下面两个条件:
    (1)这个有效子串里不同字母的数量不超过且最接近于string2里不同字母的数量,即小于或等于string2里不同字母的数量的同时且最大。
    (2)这个有效子串是满足条件(1)里的所有子串(如果有多个的话)里字典序最大的一个。
    如果没有找到合适条件的子串的话,请输出"Not Found"

示例:
输入字符串string1为"thisisanewday111forme",输入字符串string2为"good"。string1里有效子串和加扰子串分割后可表示为:"thisis"+"a"+"n"+"e"+"w"+"da"+"y"+"111f"+"orm"+"e",去除加扰子串("a""e""da""111f""e")后的有效子串候选为("thisis", "n", "w", "y", "orm")。输入字符串string2里不同字母的数量为3'g''o''d'),从有效子串候选里可以找出"orm"满足要求,其不同字母的数量为3,最接近于string2不同字母的数量。

输入描述:
input_string1
input_string2
说明:输入为两个字符串,第1行是题目里的string1(被加扰的字符串),第2行是题目里的string2(参考字符串)

输出描述:
output_string
说明:输出为一个字符串(有效字符串)
补充说明:
输入字符串string1的长度在1~100000之间,string2的长度在1~500之间

6 木板

题目描述:
小明有n块木板,第i(1 <= i <= n)块木板的长度为a_i。
小明买了一块长度为m的木料,这块木料可以切割成任意块,拼接到已有的木板上,用来加长木板。
小明想让最短的木板尽量长。
请问小明加长木板后,最短木板的长度最大可以为多少?

输入描述:
输入的第一行包含两个正整数,n(1 <= n <= 10^3)表示木板数,m(1 <= m <= 10^6)表示木料长度。
输入的第二行包含n个正整数,a_1, a_2, ..., a_n(1<=a_i<=10^6)。

输出描述:
输出的唯一一行包含一个正整数,表示加长木板后,最短木板的长度最大可以为多少?
补充说明:

示例1
输入:
5 3
4 5 3 5 5
输出:
5
说明:
给第1块木板长度增加1,给第3块木板长度增加2后,这5块木板长度变为[5,5,5,5,5],最短的木板的长度最大为5。
示例2
输入:
5 2
4 5 3 5 5
输出:
4
说明:
给第3块木板长度增加1后,这5块木板长度变为[4,5,4,5,5],剩余木料的长度为1。

此时剩余木料无论给哪块木板加长,最短木料的长度都为4

7 优秀学员统计

题目描述:
公司某部门软件教导团正在组织新员工每日打卡学习活动,他们开展这项学习活动已经一个月了,所以想统计下这个月优秀的打卡员工。每个员工会对应一个id,每天的打卡记录记录当天打卡员工的id集合,一共30天。
请你实现代码帮助统计出打卡次数top5的员工。假如打卡次数相同,将较早参与打卡的员工排在前面,如果开始参与打卡的时间还是一样,将id较小的员工排在前面。
注:不考虑并列的情况,按规则返回前5名员工的id即可,如果当月打卡的员工少于5个,按规则排序返回所有有打卡记录的员工id。
输入描述:
第一行输入为新员工数量N,表示新员工编号id为0到N-1,N的范围为[1,100]
第二行输入为30个整数,表示每天打卡的员工数量,每天至少有1名员工打卡
之后30行为每天打卡的员工id集合,id不会重复
输出描述:
按顺序输出打卡top5员工的id,用空格隔开
补充说明:
同一天打卡的员工没有时间上早晚的区别。不保证所有员工都会打卡。排名只针对有打卡记录的员工。

示例1
输入:
11
4 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2
0 1 7 10
0 1 6 10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
6 10
7 10
输出:
10 0 1 7 6
说明:
员工编号范围为0-10,id为10的员工连续打卡30天,排第一,id为0,1,6,7的员工打卡都是两天,id为0,1,7的员工在第一天就打卡,比id为6的员工早,排在前面,0,1,7按id升序排序,所以输出[10,0,1,7,6]
示例2
输入:
7
6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
输出:
0 1 2 3 4
说明:
员工编号范围为0-6,id为0,1,2,3,4,5的员工打卡次数相同,最早开始打卡的时间也一样,所以按id升序返回前5个id
示例3
输入:
2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0 1
0 1
输出:
1 0
说明:
只有两名员工参与打卡,按规则排序输出两名员工的id

8 计算至少需要多少个快递主站点

题目描述:
快递业务范围有N个站点,A站点与B站点可以中转快递,则认为A-B站可达,如果A-B可达,B-C可达,则A-C可达。现在给N个站点编号01、…n-1,用s[i][j]表示i-j是否可达,s[i][j]=1表示i-j可达,s[i][j]=0表示i-j不可达。

现用二维数组给定N个站点的可达关系,请计算至少选择从几个主站点出发,才能可达所有站点(覆盖所有站点业务)。
说明:s[i][j]与s[j][i]取值相同。

输入描述:
第一行输入为N,N表示站点个数。
之后N行表示站点之间的可达关系,第i行第j个数值表示编号为i和j之间是否可达。

输出描述:
输出站点个数,表示至少需要多少个主站点。

补充说明:
1<N<10000

示例1
输入:
4
1 1 1 1
1 1 1 0
1 1 1 0
1 0 0 1
输出:
1
说明:
选择0号站点作为主站点,0站点可达其他所有站点,所以至少选择1个站点作为主站才能覆盖所有站点业务。
示例2
输入:
4
1 1 0 0
1 1 0 0
0 0 1 0
0 0 0 1
输出:
3
说明:
选择0号站点可以覆盖01站点,选择2号站点可以覆盖2号站点,选择3号站点可以覆盖3号站点,所以至少选择3个站点作为主站才能覆盖所有站点业务。

9 知识图谱新词挖掘

题目描述:
小华负责公司知识图谱产品,现在要通过新词挖掘完善知识图谱。
新词挖掘:给出一个待挖掘文本内容字符串Content和一个词的字符串word,找到content中所有word的新词。
新词:使用词word的字符排列形成的字符串。
请帮小华实现新词挖掘,返回发现的新词的数量。

输入描述:
第一行输入为待挖掘的文本内容content;
第二行输入为词word;

输出描述:
在content中找到的所有word的新词的数量。

补充说明:
0<=content的长度<=100000001=<word的长度<=2000

示例1
输入:
qweebaewqd
qwe
输出:
2
说明:
起始索引等于 0 的子串是 "qwe", 它是 word的新词。
起始索引等于 6 的子串是 "ewq", 它是 word 的新词。
示例2
输入:
abab
ab
输出:
3
说明:
起始索引等于 0 的子串是 "ab", 它是 word的新词。
起始索引等于 1 的子串是 "ba", 它是 word的新词。
起始索引等于 2 的子串是 "ab", 它是 word的新词。

10 组合出合法最小数

题目描述:
给一个数组,数组里面都是代表非负整数的字符串,将数组里所有的数值排列组合拼接起来组成一个数字,输出拼接成的最小的数字。
输入描述:
一个数组,数组不为空,数组里面都是代表非负整数的字符串,可以是0开头,例如:["13", "045", "09", "56"]。
数组的大小范围:[1, 50]
数组中每个元素的长度范围:[1, 30]
输出描述:
以字符串的格式输出一个数字,如果最终结果是多位数字,要优先选择输出不是“0”开头的最小数字;如果拼接出的数字都是“0”开头,则选取值最小的,并且把开头部分的“0”都去掉再输出;如果是单位数“0”,可以直接输出“0”

示例1
输入:
20 1
输出:
120
说明:
["20", "1"]能组成 201120, 其中120比较小
示例2
输入:
08 10 2
输出:
10082
说明:
["08", "10", "2"]能组成 081020821010082102082081021008等数字,其中"0"开头的0810208201排除,选择最小的10082输出
示例3
输入:
01 02
输出:
102
说明:
["01", "02"]能拼接成01020201,都是“0”开头,选取较小的0102,去掉前面的0,输出102

11 日志采集系统

题目描述:
日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分批上报。
如果上报太频繁,会对服务端造成压力;如果上报太晚,会降低用户的体验;如果一次上报的条数太多,会导致超时失败。
为此,项目组设计了如下的上报策略:
1、每成功上报一条日志,奖励1分
2、每条日志每延迟上报1秒,扣1分
3、积累日志达到100条,必须立即上报
给出日志序列,根据该规则,计算首次上报能获得的最多积分数

输入描述:
按时序产生的日志条数 T1,T2...Tn, 其中 1<=n<=1000, 0<=Ti<=100

输出描述:
首次上报最多能获得的积分数

补充说明:

示例1
输入:
1 98 1
输出:
98
说明:
采集系统第2个时刻上报,可获得最大积分(98+1)-1=98

示例2
输入:
50 60 1
输出:
50
说明:
如果第1个时刻上报,获得积分50。如果第2个时刻上报,最多上报100条,前50条延迟上报1s,每条扣除1分,共获得积分为 100-50=50

12 优雅数组

题目描述:
如果一个数组中出现次数最多的元素出现大于等于k次,被称为`k-优雅数组`,k也可以被称为`优雅阈值`。
例如,数组`[1, 2, 3, 1, 2, 3, 1]`,它是一个`3-优雅数组`,因为元素`1`出现次数大于等于3次,数组`[1, 2, 3, 1, 2]`就不是一个`3-优雅数组`,因为其中出现次数最多的元素时`1`和`2`,只出现了2次。

给定一个数组A和k,请求出A有多少子数组是`k-优雅子数组`。

子数组是数组中一个或多个连续元素组成的数组。
例如,数组`[1, 2, 3, 4]`包含10个子数组,分别是:`[1]`,`[1, 2]`,`[1, 2, 3]`,`[1, 2, 3, 4]`,`[2]`,`[2, 3]`,`[2, 3, 4]`,`[3]`,`[3, 4]`,`[4]`。
输入描述:
第一行输入两个整数n和k,n是数组A的长度,k是优雅阈值。
第二行输入n个整数,表示给定的数组A1 <= n <= 10000, 1 <= k <= n
数组A中的元素A[i]满足:1 <= A[i] <= n
输出描述:
数据一个整数,表示数组A中`k-优雅子数组`的数量
行尾不要有多余空格

示例1
输入:
7 3
1 2 3 1 2 3 1
输出:
1
说明:
只有子数组[1, 2, 3, 1, 2, 3, 1]是`3-优雅数组`
示例2
输入:
7 2
1 2 3 1 2 3 1
输出:
10
说明:
10个优雅子数组分别是(下标从0计数):
长度为4[1, 2, 3, 1](下标0~3), [2, 3, 1, 2](下标1~4), [3, 1, 2, 3](下标2~5), [1, 2, 3, 1](下标3~6)
长度为5[1, 2, 3, 1, 2](下标0~4), [2, 3, 1, 2, 3](下标1~5), [3, 1, 2, 3, 1](下标2~6)
长度为6[1, 2, 3, 1, 2, 3](下标0~5), [2, 3, 1, 2, 3, 1](下标1~6)
长度为7[1, 2, 3, 1, 2, 3, 1](下标0~6)

13 开心消消乐

题目描述:
给定一个N行M列的二维矩阵,矩阵中每个位置的数字取值为01。矩阵示例如:
1 1 0 0
0 0 0 1
0 0 1 1
1 1 1 1
现需要将矩阵中所有的1进行反转为0,规则如下:
1)当点击一个1时,该1变被反转为0,同时相邻的上、下、左、右,以及左上、左下、右上、右下8个方向的1(如果存在1)均会自动反转为02)进一步地,一个位置上的1被反转为0时,与其相邻的8个方向的1(如果存在1)均会自动反转为0;
按照上述规则示例中的矩阵只最少需要点击2次后,所有值均为0。请问,给定一个矩阵,最少需要点击几次后,所有数字均为0?
输入描述:
第一行为两个整数,分别表示矩阵的行数N和列数M,取值范围均为[1, 100]
接下来N行表示矩阵的初始值,每行均为M个数,取值范围[0,1]
输出描述:
输出一个整数,表示最少需要点击的次数
补充说明:

示例1
输入:
3 3
1 0 1
0 1 0
1 0 1
输出:
1
说明:
上述样例中,四个角上的1均在中间的1的相邻8个方向上,因此只需要点击一次即可
示例2
输入:
4 4
1 1 0 0
0 0 0 1
0 0 1 1
1 1 1 1
输出:
2
说明:
在上述4 * 4的矩阵中,只需要点击2次,即可将所有的1进行消除

14 获取最大软件版本号

题目描述:
Maven版本号定义,<主版本>.<次版本>.<增量版本>-<里程碑版本>,举例3.1.4-beta
其中,主版本和次版本都是必须的,主版本,次版本,增量版本由多位数字组成,可能包含前导零,里程碑版本由字符串组成。
<主版本>.<次版本>.<增量版本>:基于数字比较
里程碑版本:基于字符串比较,采用字典序
比较版本号时,按从左到右的顺序依次比较。基于数字比较, 只需比较忽略任何前导零后的整数值 。
输入2个版本号,输出最大版本号
输入描述:
输入2个版本号,换行分割,每个版本的最大长度小于50
输出描述:
版本号相同时输出第一个输入版本号

补充说明:
主版本,次版本,增量版本:基于字符串比较,比如
1.5>1.4>1.3.11>1.3.9
里程碑版本:基于字符串比较 比如
1.2-beta-3>1.2-beta-11

示例1
输入:
2.5.1-C
1.4.2-D
输出:
2.5.1-C
说明:
主版本,数字2大于1
示例2
输入:
1.3.11-S2
1.3.11-S13
输出:
1.3.11-S2
说明:
里程碑版本,S2大于S13
示例3
输入:
1.05.1
1.5.01
输出:
1.05.1
说明:
版本号相同,输出第一个版本号
示例4
输入:
1.5
1.5.0
输出:
1.5.0
说明:
主次相同,存在增量版本大于不存在
示例5
输入:
1.5.1-A
1.5.1-a
输出:
1.5.1-a
说明:
里程碑版本号,字符串比较a大于A

15 区块链文件转储系统

题目描述:
区块链底层存储是一个链式文件系统,由顺序的N个文件组成,每个文件的大小不一,依次为F1,F2...Fn。随着时间的推移,所占存储会越来越大。
云平台考虑将区块链按文件转储到廉价的SATA盘,只有连续的区块链文件才能转储到SATA盘上,且转储的文件之和不能超过SATA盘的容量。
假设每块SATA盘容量为M,求能转储的最大连续文件大小之和。
输入描述:
第一行为SATA盘容量M,1000<=M<=1000000
第二行为区块链文件大小序列F1,F2...Fn。其中 1<=n<=100000, 1<=Fi<=500

输出描述:
求能转储的最大连续文件大小之和

示例1
输入:
1000
100 300 500 400 400 150 100
输出:
950
说明:
最大序列和为950,序列为[400,400,150]
示例2
输入:
1000
100 500 400 150 500 100
输出:
1000
说明:
最大序列和为1000,序列为[100,500,400]

16 找出通过车辆最多颜色

题目描述:
在一个狭小的路口,每秒只能通过一辆车,假如车辆的颜色只有3种,找出N秒内经过的最多颜色的车辆数量
三种颜色编号为0,1,2
输入描述:
第一行输入的是通过的车辆颜色信息
[0,1,1,2] 代表4秒钟通过的车辆颜色分别是0,1,1,2
第二行输入的是统计时间窗,整型,单位为秒
输出描述:
输出指定时间窗内经过的最多颜色的车辆数量
补充说明:

示例1
输入:
0 1 2 1
3
输出:
2
说明:
在[1,2,1]这个3秒时间窗内,1这个颜色出现2次,数量最多
示例2
输入:
0 1 2 1
2
输出:
1
说明:
在2秒时间窗内,每个颜色最多出现1

17 任务总执行时长

题目描述:
任务编排服务负责对任务进行组合调度。参与编排的任务有两种类型,其中一种执行时长为taskA,另一种执行时长为taskB。任务一旦开始执行不能被打断,且任务可连续执行。服务每次可以编排num个任务。请编写一个方法,生成每次编排后的任务所有可能的总执行时长。
输入描述:
第1行输入分别为第1种任务执行时长taskA,第2种任务执行时长taskB,这次要编排的任务个数num,以逗号分隔。
输出描述:
数组形式返回所有总执行时时长,需要按从小到大排列。
补充说明:
每种任务的数量都大于本次可以编排的任务数量。
0 < taskA
0 < taskB
0 <= num <= 100000

示例1
输入:
1,2,3
输出:
[3, 4, 5, 6]
说明:
可以执行 3 次 taskA,得到结果 3;执行 2 次 taskA和 1 次 taskB,得到结果 4 。以此类推,得到最终结果。

18 最差产品奖

题目描述:
A公司准备对他下面的N个产品评选最差奖,评选的方式是首先对每个产品进行评分,然后根据评分区间计算相邻几个产品中最差的产品。评选的标准是依次找到从当前产品开始前M个产品中最差的产品,请给出最差产品的评分序列。
输入描述:
第一行,数字M,表示评分区间的长度,取值范围是0<M<10000
第二行,产品的评分序列,比如[12,3,8,6,5],产品数量N范围是-10000<N<10000

输出描述:
评分区间内最差产品的评分序列

补充说明:

示例1
输入:
3
12,3,8,6,5
输出:
3,3,5
说明:
12,3,8 最差的是3
3,8,6 中最差的是3
8,6,5 中最差的是5

19 光伏场地建设规划

题目描述:
祖国西北部有一片大片荒地,其中零星的分布着一些湖泊,保护区,矿区;整体上常年光照良好,但是也有一些地区光照不太好。某电力公司希望在这里建设多个光伏电站,生产清洁能源。对每平方公里的土地进行了发电评估,其中不能建设的区域发电量为0kw,可以发电的区域根据光照,地形等给出了每平方公里年发电量x千瓦。我们希望能够找到其中集中的矩形区域建设电站,能够获得良好的收益。
输入描述:
第一行输入为调研的地区长,宽,以及准备建设的电站【长宽相等,为正方形】的边长,最低要求的发电量
之后每行为调研区域每平方公里的发电量
例如,输入为:
2 5 2 6
1 3 4 5 8
2 3 6 7 1

表示调研的区域大小为长2宽5的矩形,我们要建设的电站的边长为2,建设电站最低发电量为6
输出描述:
输出为这样的区域有多少个
上述输入长宽为2的正方形满足发电量大于等于6的区域有4个。
则输出为:
4
补充说明:
其中 被调研的区域的长宽均大于等于1,建设电站的边长大于等于1,任何区域的发电量大于等于0

示例1
输入:
2 5 2 6
1 3 4 5 8
2 3 6 7 1
输出:
4
说明:
输入长为2,宽为5的场地,建设的场地为正方形场地,边长为2,要求场地的发电量大于等于6
示例2
输入:
2 5 1 6
1 3 4 5 8
2 3 6 7 1
输出:
3
说明:
输入长为2,宽为5的场地,建设的场地为正方形场地,边长为1,要求场地的发电量大于等于6
示例3
输入:
2 5 1 0
1 3 4 5 8
2 3 6 7 1
输出:
10
说明:
输入长为2,宽为5的场地,建设的场地为正方形场地,边长为1,要求场地的发电量大于等于0即可

20 数组的中心位置

题目描述:
给你一个整数数组nums,请计算数组的中心位置 。数组中心位置是数组的一个下标,其左侧所有元素相乘的积等于右侧所有元素相乘的积。
数组第一个元素的左侧积为1,最后一个元素的右侧积为1
如果数组有多个中心位置,应该返回最靠近左边的那一个。如果数组不存在中心位置,返回 -1 。
输入描述:
输入只有一行,给出N个正整数用空格分格:nums = 2 5 3 6 5 6
1 <= nums.length <= 1024
1 <= nums[i] <= 10

输出描述:
输出:3
解释:
中心位置是 3 。
左侧数之积 sum = nums[0] * nums[1] * nums[2] = 2 * 5 * 3 = 30 ,
右侧数之积 sum = nums[4] * nums[5] = 5 * 6 = 30 ,二者相等。

补充说明:

示例1
输入:
2 5 3 6 5 6
输出:
3
说明:

21 最优资源分配

题目描述:
某块业务芯片最小容量单位为1.25G,总容量为M*1.25G,对该芯片资源编号为1,2, ..., M。该芯片支持3种不同的配置,分别为AB、C。
配置A:占用容量为1.25 * 1 = 1.25G
配置B:占用容量为1.25 * 2 = 2.5G
配置C:占用容量为1.25 * 8 = 10G
某块板卡上集成了N块上述芯片,对芯片编号为1,2,...,N,各个芯片之间彼此独立,不能跨芯片占用资源。给定板卡上芯片数量N、每块芯片容量M、用户按次序配置后,请输出芯片资源占用情况,保证消耗的芯片数量最少。
资源分配规则:按照芯片编号从小到大分配所需资源,芯片上资源如果被占用标记为1,没有被占用标记为0。
用户配置序列:用户配置是按次序依次配置到芯片中,如果用户配置序列中某个配置超过了芯片总容量,丢弃该配置,继续遍历用户后续配置。
输入描述:
M:每块芯片容量为M*1.25G,取值范围为1~256
N:每块板卡包含芯片数量,取值范围为1~32
用户配置序列:例如ACABA,长度不超过1000
输出描述:
板卡上每块芯片的占用情况
补充说明:
用户配置是按次序依次配置到芯片中,如果用户配置序列中某个配置超过了芯片总容量,丢弃该配置,继续遍历用户后续配置。

示例1
输入:
8             
2    
ACABA
输出:
11111000
11111111
说明:
用户第1个配置A:占用第1块芯片第1个资源,芯片占用情况为:
10000000
00000000
用户第2个配置C:第1块芯片剩余8.75G,配置C容量不够,只能占用第2块芯片,芯片占用情况为:
10000000
11111111
用户第3个配置A:第1块芯片剩余8.75G,还能继续配置,占用第1块芯片第2个资源,芯片占用情况为:
11000000
11111111
用户第4个配置B:第1块芯片剩余7.5G,还能继续配置,占用第1块芯片第3/4个资源,芯片占用情况为:
11110000
11111111
用户第5个配置A:第1块芯片剩余5G,还能继续配置,占用第1块芯片第5个资源,芯片占用情况为:
11110000
11111111
示例2
输入:
8
2
ACBCB
输出:
11111000
11111111
说明:
用户第1个配置A:占用第1块芯片第1个资源,芯片占用情况为:
10000000
00000000
用户第2个配置C:第1块芯片剩余8.75G,配置C容量不够,只能占用第2块芯片,芯片占用情况为:
10000000
11111111
用户第3个配置B:第1块芯片剩余8.75G,还能继续配置,占用第1块芯片第23个资源,芯片占用情况为:
11100000
11111111
用户第4个配置C:芯片资源不够,丢弃配置配置,继续下一个配置,本次配置后芯片占用情况保持不变:
11100000
11111111
用户第5个配置B:第1块芯片剩余6.25G,还能继续配置,占用第1块芯片第45个资源,芯片占用情况为:
11111000
11111111

22 寻找密码

题目描述:
小王在进行游戏大闯关,有一个关卡需要输入一个密码才能通过。密码获得的条件如下:在一个密码本中,每一页都有一个由26个小写字母组成的若干位密码,每一页的密码不同,需要从这个密码本中寻找这样一个最长的密码,从它的末尾开始依次去掉一位得到的新密码也在密码本中存在。请输出符合该要求的密码,如果有多个符合要求的密码,则返回字典序最大的密码。若没有符合要求的密码,则返回空字符串。

输入描述:
密码本由一个字符串数组组成,不同元素之间使用空格隔开,每一个元素代表密码本每一页的密码

输出描述:
一个字符串

补充说明:
1 <= 密码本的页数 <= 105
1 <= 每页密码的长度 <= 105

示例1
输入:
h he hel hell hello
输出:
hello
说明:
"hello"从末尾依次去掉一位得到的 "hell""hel""he""h"在密码本中都存在。

示例2
输入:
b eredderd bw bww bwwl bwwlm bwwln
输出:
bwwln
说明:
"bwwlm ""bwwln" 从末尾开始依次去掉一位得到密码在密码本中都存在。但是 "bwwln""bwwlm" 字典序排序大,所以应该返回"bwwln"

23 Linux发行版的数量

题目描述:
Linux操作系统有多个发行版,distrowatch.com提供了各个发行版的资料。这些发行版互相存在关联,例如Ubuntu基于Debian开发,而Mint又基于Ubuntu开发,那么我们认为Mint同Debian也存在关联。

发行版集是一个或多个相关存在关联的操作系统发行版,集合内不包含没有关联的发行版。

给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个发行版和第 j 个发行版直接关联,而 isConnected[i][j] = 0 表示二者不直接相连。

返回最大的发行版集中发行版的数量

输入描述:
第一行输入发行版的总数量N,之后每行表示各发行版间是否直接相关

输出描述:
输出最大的发行版集中发行版的数量

补充说明:
1 <= N <= 200

示例1
输入:
4
1 1 0 0
1 1 1 0
0 1 1 0
0 0 0 1
输出:
3
说明:
Debian(1)和Ubuntu(2)相关,Mint(3)和Ubuntu(2)相关,EeulerOS(4)和另外三个都不相关,所以存在两个发行版集,发行版集中发行版的数量分别是31,所以输出3

24 最小的调整次数

题目描述:
有一个特异性的双端队列,该队列可以从头部或尾部添加数据,但是只能从头部移出数据。
小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添加数据( **可能从头部添加、也可能从尾部添加** ),依次添加1到n;n个指令是移出数据。现在要求移除数据的顺序为1到n。为了满足最后输出的要求,小A可以在任何时候调整队列中数据的顺序。

请问 小A 最少需要调整几次才能够满足移除数据的顺序正好是1到n;

输入描述:
第一行一个整数 n,表示数据范围。
接下来有 2n 行,其中有 n 行为添加数据:指令“ head add x”表示从头部添加数据x,“ tail add x”表示从尾部添加数据x;另外 n 行为移出数据指令,指令为 “remove” 的形式,表示移出1个数据;1 ≤ n ≤ 3 * 10^5。
所有的数据均合法。

输出描述:
一个整数,表示 小A 要调整的最小次数。

补充说明:
输入会保证按照1到n的顺序加入队列。确保输出时对应的数据已经在队列中。

示例1
输入: 3
      head add 1
      remove
      tail add 2
      head add 3
      remove
      remove
输出:1
说明:

下图展示了所给用例的执行过程。其中,第一次remove,不需要调整,可以直接满足输出要求;第二次remove命令执行时,需要调整队列中元素的位置,将2调整到最前面,才可以满足输出的要求。这个调整可以任何时候进行,可以调整成任何顺序。