一.第一题
(1)题目:根据数字二进制下 1 的数目排序
给你一个整数数组 arr
。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。
如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。
请你返回排序后的数组。
示例1:
示例2:
示例3:
示例4:
示例5:
提示:
-
1 <= arr.length <= 500
-
0 <= arr[i] <= 10^4
(2)算法思想
统计数的二进制中1的个数用位运算a&=(a-1),每次位运算实现去掉距离最右边最近的一个1,如a=10,则a&(a-1)=10&9=1010 & 1001=1000=8,就实现10的二进制1010的最右边的一个1去掉了。
直接调用库函数sort,可以三个参数也可以两个参数,如果是在pat中则必须上头文件#include < algorithm>和using namespace std。
(3)代码
二.第二题
(1)题目:每隔 n 个顾客打折
超市里正在举行打折活动,每隔 n
个顾客会得到 discount
的折扣。
超市里有一些商品,第 i
种商品为 products[i]
且每件单品的价格为 prices[i]
。
结账系统会统计顾客的数目,每隔 n
个顾客结账时,该顾客的账单都会打折,折扣为 discount
(也就是如果原本账单为 x
,那么实际金额会变成 x - (discount * x) / 100
),然后系统会重新开始计数。
顾客会购买一些商品, product[i]
是顾客购买的第 i
种商品, amount[i]
是对应的购买该种商品的数目。
请你实现 Cashier
类:
-
Cashier(int n, int discount, int[] products, int[] prices)
初始化实例对象,参数分别为打折频率n
,折扣大小discount
,超市里的商品列表products
和它们的价格prices
。 -
double getBill(int[] product, int[] amount)
返回账单的实际金额(如果有打折,请返回打折后的结果)。返回结果与标准答案误差在10^-5
以内都视为正确结果
提示:
-
1 <= n <= 10^4
-
0 <= discount <= 100
-
1 <= products.length <= 200
-
1 <= products[i] <= 200
-
products
列表中不会有重复的元素。 -
prices.length == products.length
-
1 <= prices[i] <= 1000
-
1 <= product.length <= products.length
-
product[i]
在products
出现过。 -
amount.length == product.length
-
1 <= amount[i] <= 1000
- 最多有
1000
次对getBill
函数的调用。 - 返回结果与标准答案误差在
10^-5
以内都视为正确结果。
(2)算法思想
快乐模拟题,用map存储产品号和对应的价格,每次getBill将cnt加1,如果最后cnt为n的倍数则幸运用户打折。
(3)代码
三.第三题
(1)题目:包含所有三种字符的子字符串数目
lc题号【5325】
给你一个字符串 s
,它只包含三种字符 a, b 和 c 。
请你返回 a,b 和 c 都 至少 出现过一次的子字符串数目。
示例1:
示例2:
示例3:
提示:
-
3 <= s.length <= 5 x 10^4
-
s
只包含字符 a,b 和 c 。
(2)算法思想
滑动窗口
滑动窗口解决子串问题:https://mp.weixin.qq.com/s/nJHIxQ2BbqhDv5jZ9NgXrQ
(3)代码
四.第四题
(1)题目:有效的快递序列数目
给你 n
笔订单,每笔订单都需要快递服务。
请你统计所有有效的 收件/配送 序列的数目,确保第 i
个物品的配送服务 delivery(i)
总是在其收件服务 pickup(i)
之后。
由于答案可能很大,请返回答案对 10^9 + 7
取余的结果。
示例1:
示例2:
示例3:
提示:
-
1 <= n <= 500
(2)算法思想
组合数学题,此处填坑,现在不想看。。
(3)代码