2023大厂笔试模拟练习网站(含题解)
www.codefun2000.com
最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200+道互联网大厂模拟练习题,还在极速更新中。欢迎关注公众号“塔子哥学算法”获取最新消息。
今天带来的是4.14华为od春招的三道题目。最近有很多热爱刷题的小伙伴主动地将自己的做题过程与思路录制成视频分享在B站,欢迎大家前去学习支持!视频链接:https://space.bilibili.com/298539770
每道题目附有思路提示,对应的题解(各种语言)欢迎前往www.codefun2000.com查看。
第一题
题目内容
有一个特异性的双端队列,该队列可以从头部或尾部添加数据但息只能从头部移出数据。塔子哥依次执行 2 × n 2\times n 2×n 个指令往队列中添加数据和移出数据。
其中 n n n 个指令是添加数据(可能从头部添加、也可能从尾部添加),依次添加 1 1 1 到 n n n ;
还有 n n n 个指令是移出数据。现在要求移除数据的顺序为 1 1 1 到 n n n 。
为了满足最后输出的要求,塔子哥可以在任何时候调整队列中数据的顺序。
请问塔子哥最少需要调整几次才能够满足移除数据的顺序正好是 1 1 1 到 n n n 。
输入描述
第一行一个整数 n n n ,表示数据范围。
接下来有
2
×
n
2\times n
2×n 行,其中有
n
n
n 行为添加数据:指令 head add x
表示从头部添加数据
x
x
x , tail add x
表示从尾部添加数据
x
x
x ;
另外
n
n
n 行为移出数据指令,指令为 remove
的形式,表示移出
1
1
1 个数据;
1 ≤ n ≤ 3 × 1 0 5 1\le n\le 3\times 10^5 1≤n≤3×105 。
所有的数据均合法。
注意:输入会保证按照1到n的顺序加入队列,确保输出时对应的的数据已经在队列中
输出描述
一个整数,表示塔子哥要调整的最小次数。
样例
输入
3
head add 1
remove
tail add 2
head add 3
remove
remove
输出
1
样例解释
输入命令 | 队列 |
---|---|
head add 1 | 1 |
remove | |
tail add 2 | 2 |
head add 3 | 3 2 |
remove | 2 3(调整一次) |
3 | |
remove |
上述表格展示了所给用例的执行过程。
其中,第一次remove不需要调整,可以直接满足输出要求;
第二次remove命令执行时,需要调整队列中元素的位置,将2调整到最前面才可以满足输出的要求。
这个调整可以任何时候进行,可以调移成任何顺序。
思路:思维题,注意理解题意
第二题
题目内容
阿华的网上商城举办优惠活动,发布了满减、打折、无门槛三种优惠券,分别为:
- 每满 100 100 100 元优惠 10 10 10 元,无使用数限制,如 100 − 199 100-199 100−199 元可以使用 1 1 1 张减 10 10 10 元, 200 − 299 200-299 200−299 可使用 2 2 2 张减 20 20 20 元,以此类推;
- 92 92 92 折券, 1 1 1 次限使用 1 1 1 张,如 100 100 100 元,则优惠后为 92 92 92 元;
- 无门槛 5 5 5 元优惠券,无使用数限制,直接减 5 5 5 元。
每次最多使用 2 2 2 种优惠券, 2 2 2 种优惠可以叠加 (优惠叠加时以优惠后的价格计算),以购物 200 200 200 元为例,可以先用 92 92 92 折券优惠到 184 184 184 元,再用 1 1 1 张满减券优惠 10 10 10 元,最终价格是 174 174 174 元,也可以用满减券 2 2 2 张优惠 20 20 20 元为 180 180 180 元,再使用 92 92 92 折券优惠到 165 165 165 ( 165.6 165.6 165.6 向下取整)元,不同使用顺序的优惠价格不同,以最优惠价格为准。在一次购物中,同一类型优惠券使用多张时必须一次性使用,不能分多次拆开穿插使用 (不允许先使用 1 1 1 张满减券,再用打折券,再使用一张满减券) 。
现在请你设计实现一种解决方法,帮助购物者以最少的优惠券获得最优的优惠价格。优惠后价格越低越好,同等优惠价格,使用的优惠券越少越好,可以允许某次购物不使用优惠券。
优惠活动每人只能参加一次,每个人的优惠券种类和数量是一样的。
输入描述
第一行:三个整数 n u m 1 , n u m 2 , n u m 3 num1,num2,num3 num1,num2,num3 ,表示每个人拥有的每种优惠券的数量,按满减、打折、无门槛的顺序输入。( 1 ≤ n u m 1 , n u m 2 , n u m 3 ≤ 10 1\le num1,num2,num3\le 10 1≤num1,num2,num3≤10 )
第二行:一个整数 n n n ,表示购物的人数。( 1 ≤ n ≤ 10000 1 \le n \le 10000 1≤n≤10000 )
最后 n n n 行:每一行一个整数 p r i c e price price ,表示某个人优惠前的购物总价格。( 1 ≤ p r i c e ≤ 1000 1\le price \le 1000 1≤price≤1000 )
输入都是符合题目设定的要求的。
输出描述
每行输出每个人每次购物优惠后的最低价格以及使用的优惠券总教量,每行的输出顺序和输入的顺序保持一致。
样例
输入
3 2 5
3
100
200
400
输出
65 6
155 7
338 4
样例解释
输入 3 3 3 个人,输出 3 3 3 行结果,同输入的顺序,对应每个人的优惠结果,如下:
第一行,先使用 1 1 1张满减券优惠到 90 90 90 元,再使用 5 5 5 张无门槛券优惠 25 25 25 元,最终价格是 65 65 65 元,总共使用 6 6 6 张优惠券;
第二行,先使用 2 2 2 张满减券优惠到 180 180 180 元,再使用 5 5 5 张无门槛券优惠 25 25 25 元,最终价格是 155 155 155 元,总共使用 7 7 7 张优惠券;
第三行,先使用 1 1 1 张 92 92 92 折券优惠到 368 368 368 元,再使用 3 3 3 张满减券优惠 30 30 30 元,最终价格是 338 338 338 元,总共使用 4 4 4 张优惠券。
第三题
题目内容
有一个由纯数字组成以字符串表示的数值,现要求字符串中的每个数字最多只能出现 2 2 2 次,超过的需要进行删除,删除某个重复的数字后,其它数字相对位置保持不变。
现在想请你帮忙得到经过删除操作后的最大的数值,以字符串表示。
输入描述
第一行为一个纯数字组成的字符串 s t r str str 。( 1 ≤ s t r . l e n g t h ( ) ≤ 100000 1\le str.length() \le 100000 1≤str.length()≤100000 )
输出描述
输出经过删除操作后的最大的数值。
样例
样例1
输入
34533
输出
4533
样例2
输入
5445795045
输出
5479504