LeetCode 第 20 场双周赛(294 / 1541,前19.07%,第1次全部通过)

文章目录

    • 1. 比赛结果
    • 2. 题目
      • LeetCode 5323. 根据数字二进制下 1 的数目排序 easy
      • LeetCode 5324. 每隔 n 个顾客打折 medium
      • LeetCode 5325. 包含所有三种字符的子字符串数目 medium
      • LeetCode 5326. 有效的快递序列数目 hard

1. 比赛结果

第一次全部做出来了,提前6分钟结束战斗,激动啊,今晚睡得着吗?哈哈

全国排名:294/1541,前19.07%;全球排名:885/4347,前20.4%

  • 第4题,忘记取模%,错误一次(有点冤。。。)
  • 第2题有点失误(错了3次),花费时间过长,还用了本地IDE调试了几次
    做题顺序如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2. 题目

LeetCode 5323. 根据数字二进制下 1 的数目排序 easy

题目链接
给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。

如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。

请你返回排序后的数组。

示例 1:
输入:arr = [0,1,2,3,4,5,6,7,8]
输出:[0,1,2,4,8,3,5,6,7]
解释:[0] 是唯一一个有 01 的数。
[1,2,4,8] 都有 11[3,5,6]21[7]31 。
按照 1 的个数排序得到的结果数组为 [0,1,2,4,8,3,5,6,7]示例 2:
输入:arr = [1024,512,256,128,64,32,16,8,4,2,1]
输出:[1,2,4,8,16,32,64,128,256,512,1024]
解释:数组中所有整数二进制下都只有 11 ,所以你需要按照数值大小将它们排序。示例 3:
输入:arr = [10000,10000]
输出:[10000,10000]示例 4:
输入:arr = [2,3,5,7,11,13,17,19]
输出:[2,3,5,17,7,11,13,19]示例 5:
输入:arr = [10,100,1000,10000]
输出:[10,100,10000,1000]提示:
1 <= arr.length <= 500
0 <= arr[i] <= 10^4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


解答:

  • 自定义排序,用的 lambda 表示式
int count(int n)
{int c = 0;while(n)//计算n的二进制1的个数{c++;n = n&(n-1);}return c;
}
class Solution {
public:vector<int> sortByBits(vector<int>& arr) {sort(arr.begin(), arr.end(),[](auto& a, auto& b) {if(count(a) == count(b))return a < b;return count(a) < count(b);});return arr;}
};

执行用时:8 ms
内存消耗:12.2 MB

LeetCode 5324. 每隔 n 个顾客打折 medium

题目链接
超市里正在举行打折活动,每隔 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:
输入
["Cashier","getBill","getBill","getBill","getBill","getBill","getBill","getBill"]
[[3,50,[1,2,3,4,5,6,7],[100,200,300,400,300,200,100]],[[1,2],[1,2]],[[3,7],[10,10]],[[1,2,3,4,5,6,7],[1,1,1,1,1,1,1]],[[4],[10]],[[7,3],[10,10]],[[7,5,3,1,6,4,2],[10,10,10,9,9,9,7]],[[2,3,5],[5,3,2]]]
输出
[null,500.0,4000.0,800.0,4000.0,4000.0,7350.0,2500.0]
解释
Cashier cashier = new Cashier(3,50,[1,2,3,4,5,6,7],[100,200,300,400,300,200,100]);
cashier.getBill([1,2],[1,2]);                        
// 返回 500.0, 账单金额为 = 1 * 100 + 2 * 200 = 500.
cashier.getBill([3,7],[10,10]);                     
// 返回 4000.0
cashier.getBill([1,2,3,4,5,6,7],[1,1,1,1,1,1,1]);    
// 返回 800.0 ,账单原本为 1600.0 ,但由于该顾客是第三位顾客,
他将得到 50% 的折扣,所以实际金额为 1600 - 1600 * (50 / 100) = 800 。
cashier.getBill([4],[10]);                           
// 返回 4000.0
cashier.getBill([7,3],[10,10]);                      
// 返回 4000.0
cashier.getBill([7,5,3,1,6,4,2],[10,10,10,9,9,9,7]); 
// 返回 7350.0 ,账单原本为 14700.0 ,
但由于系统计数再次达到三,该顾客将得到 50% 的折扣,实际金额为 7350.0 。
cashier.getBill([2,3,5],[5,3,2]);                    
// 返回 2500.0提示:
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 以内都视为正确结果。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/apply-discount-every-n-orders
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


解题:

  • 注意使用哈希表查找product[i]products里的下标
class Cashier {int num;int disc;vector<int> pric;unordered_map<int,int> idx;int people = 0;int i;double money;
public:Cashier(int n, int discount, vector<int>& products, vector<int>& prices) {num = n;disc = discount;pric = prices;for(i = 0; i < products.size();++i){idx.insert(make_pair(products[i],i));}}double getBill(vector<int> product, vector<int> amount) {money = 0;for(i = 0; i < product.size(); i++){money += pric[idx[product[i]]]*amount[i];}people++;if(people == num){people = 0;money = money*(100-disc)/100;}return money;}
};

执行用时:228 ms
内存消耗:119.9 MB

LeetCode 5325. 包含所有三种字符的子字符串数目 medium

题目链接

给你一个字符串 s ,它只包含三种字符 a, b 和 c 。

请你返回 a,b 和 c 都 至少 出现过一次的子字符串数目。(相同字符串算多次)

示例 1:
输入:s = "abcabc"
输出:10
解释:包含 a,b 和 c 各至少一次的子字符串为 "abc", "abca", "abcab", "abcabc", "bca", 
"bcab", "bcabc", "cab", "cabc""abc" (相同字符串算多次)。示例 2:
输入:s = "aaacb"
输出:3
解释:包含 a,b 和 c 各至少一次的子字符串为 "aaacb", "aacb""acb" 。示例 3:
输入:s = "abc"
输出:1提示:
3 <= s.length <= 5 x 10^4
s 只包含字符 a,b 和 c 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-substrings-containing-all-three-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


解题:

  • 先顺序记录下所有的 a,b,c 的位置,存储于 pa,pb,pc
  • 然后遍历 pa,pb,pc 分别以a开头,b开头,c开头查找,开始的下标start是知道的
  • 然后在另外两个数组里二分查找,第一个比start大的下标
  • 如果都存在另外两个下标比start大,那么可有的子串数就是 s.size()-最大的下标
class Solution {vector<int> pa;vector<int> pb;vector<int> pc;
public:int numberOfSubstrings(string s) {int i,x,y;for(i = 0; i < s.size(); i++){	//记录abc的下标if(s[i] == 'a')pa.push_back(i);else if(s[i] == 'b')pb.push_back(i);elsepc.push_back(i);}if(pa.empty() || pb.empty() || pc.empty())return 0;int count = 0;for(auto& idxa : pa){x = bsfirst(idxa,pb);//二分查找第一个大于idxa的下标y = bsfirst(idxa,pc);if(x==-1 || y==-1)continue;//有一个字符没有找到,没有符合的子串count += s.size()-max(pb[x],pc[y]);}for(auto& idxb : pb){x = bsfirst(idxb,pa);y = bsfirst(idxb,pc);if(x==-1 || y==-1)continue;count += s.size()-max(pa[x],pc[y]);}for(auto& idxc : pc){x = bsfirst(idxc,pb);y = bsfirst(idxc,pa);if(x==-1 || y==-1)continue;count += s.size()-max(pb[x],pa[y]);}return count;}int bsfirst(int idx, vector<int>& v){	//二分查找,第一个比idx大的数int l = 0, r = v.size()-1, mid;while(l <= r){mid = l+((r-l)>>1);if(v[mid] < idx)l = mid+1;else if(v[mid] > idx){if(mid == 0 || v[mid-1] < idx)return mid;elser = mid-1;}}return -1;}
};

执行用时:76 ms
内存消耗:17.3 MB

LeetCode 5326. 有效的快递序列数目 hard

题目链接

给你 n 笔订单,每笔订单都需要快递服务。

请你统计所有有效的 收件/配送 序列的数目,确保第 i 个物品的配送服务 delivery(i) 总是在其收件服务 pickup(i) 之后。

由于答案可能很大,请返回答案对 10^9 + 7 取余的结果。

示例 1:
输入:n = 1
输出:1
解释:只有一种序列 (P1, D1),物品 1 的配送服务(D1)在物品 1 的收件服务(P1)后。示例 2:
输入:n = 2
输出:6
解释:所有可能的序列包括:
(P1,P2,D1,D2)(P1,P2,D2,D1)(P1,D1,P2,D2)(P2,P1,D1,D2)(P2,P1,D2,D1)(P2,D2,P1,D1)(P1,D2,P2,D1) 是一个无效的序列,因为物品 2 的收件服务(P2)不应在物品 2 的配送服务(D2)之后。示例 3:
输入:n = 3
输出:90提示:
1 <= n <= 500

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-all-valid-pickup-and-delivery-options
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


解题:

  • 动态规划问题
  • dp[i] 表示 i 件物品可能的投递次序数
  • 在 dp[i-1] 的基础上,考虑两端,他有一共有 2∗(i−1)+1=2i−12*(i-1)+1 = 2i-12(i1)+1=2i1 个空位
  • 第 i 个包裹分开投递,那么插空有 C2i−12=(2i−1)(2i−2)/2=(2i−1)(i−1)C_{2i-1}^2 = (2i-1)(2i-2)/2=(2i-1)(i-1)C2i12=(2i1)(2i2)/2=(2i1)(i1) 种可能
  • 第 i 个包裹不分开,连续1投1递,那么插空有 2i−12i-12i1种可能
  • 两种情况相加*乘以之前的种类即可:
    dp[i]=dp[i−1]∗[(2∗i−1)∗(i−1)+2∗i−1]=dp[i−1]∗(2∗i−1)∗idp[i] = dp[i-1]*[(2*i-1)*(i-1)+2*i-1]=dp[i-1]*(2*i-1)*idp[i]=dp[i1][(2i1)(i1)+2i1]=dp[i1](2i1)i
class Solution {
public:int countOrders(int n) {vector<long> dp(n+1,0);dp[1] = 1;for(int i = 2; i <= n; ++i){dp[i] = dp[i-1]*(2*i-1)*i%1000000007;}return dp[n];}
};

执行用时:0 ms
内存消耗:8.6 MB

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot中的缓存支持(二)使用Redis做集中式缓存

上一篇介绍了在Spring Boot中如何引入缓存、缓存注解的使用、以及EhCache的整合。 虽然EhCache已经能够适用很多应用场景&#xff0c;但是由于EhCache是进程内的缓存框架&#xff0c;在集群模式下时&#xff0c;各应用服务器之间的缓存都是独立的&#xff0c;因此在不同服务器…

NLP开源数据集汇总

源 | 极市平台本文汇总了几个NLP相关的开源数据集&#xff0c;均附有下载链接。CASIA手写数据集数据集地址&#xff1a;http://m6z.cn/6pFPtCCASIA-HWDB-T&#xff1a;一个从中文手写数据库CASIA-HWDB收集的触摸字符数据库。所有接触的字符&#xff08;或字符串&#xff09;都用…

LeetCode 1360. 日期之间隔几天(闰年判断)

1. 题目 请你编写一个程序来计算两个日期之间隔了多少天。 日期以字符串形式给出&#xff0c;格式为 YYYY-MM-DD&#xff0c;如示例所示。 示例 1&#xff1a; 输入&#xff1a;date1 "2019-06-29", date2 "2019-06-30" 输出&#xff1a;1示例 2&…

“我要做小小瑶大人的狗!”

小轶&#xff1a;这真的是白鹡鸰写的作为21世纪新时代人格健全&#xff0c;精神独立&#xff0c;心理健康的有志青年&#xff0c;总有那么几个时刻&#xff0c;会让我们情不自禁&#xff0c;眼泪从嘴角流下地呐喊着&#xff1a;“我是XXX的狗&#xff01;”啊&#xff01;这诚恳…

Spring Boot中的缓存支持(一)注解配置与EhCache使用

随着时间的积累&#xff0c;应用的使用用户不断增加&#xff0c;数据规模也越来越大&#xff0c;往往数据库查询操作会成为影响用户使用体验的瓶颈&#xff0c;此时使用缓存往往是解决这一问题非常好的手段之一。Spring 3开始提供了强大的基于注解的缓存支持&#xff0c;可以通…

LeetCode 1361. 验证二叉树(图的出入度)

1. 题目 二叉树上有 n 个节点&#xff0c;按从 0 到 n-1 编号&#xff0c;其中节点 i 的两个子节点分别是 leftChild[i] 和 rightChild[i]。 只有 所有 节点能够形成且 只 形成 一颗 有效的二叉树时&#xff0c;返回 true&#xff1b;否则返回 false。 如果节点 i 没有左子节…

微软:我已把显存优化做到了极致,还有谁?

文 | 王思若大家好&#xff0c;我是王思若。17年6月Google提出了Transformer架构&#xff0c;这篇目前Citation 4.3万的文章开启了大规模预训练模型时代。或者&#xff0c;更精确的从18年OpenAI和Google分别基于其中的Decoder和Encoder发布的大规模预训练模型GPT1和BERT开始&am…

Spring Boot中使用JavaMailSender发送邮件

相信使用过Spring的众多开发者都知道Spring提供了非常好用的JavaMailSender接口实现邮件发送。在Spring Boot的Starter模块中也为此提供了自动化配置。下面通过实例看看如何在Spring Boot中使用JavaMailSender发送邮件。 快速入门 在Spring Boot的工程中的pom.xml中引入sprin…

LeetCode 1362. 最接近的因数

1. 题目 给你一个整数 num&#xff0c;请你找出同时满足下面全部要求的两个整数&#xff1a; 两数乘积等于 num 1 或 num 2以绝对差进行度量&#xff0c;两数大小最接近 你可以按任意顺序返回这两个整数。 示例 1&#xff1a; 输入&#xff1a;num 8 输出&#xff1a;[3…

光子神经网络登上nature,图像识别速度降至1纳秒

文 | Alex&#xff08;凹非寺&#xff09;源 | 量子位比深度神经网络速度还快的是什么&#xff1f;或许光子DNN可以回答这个问题。现在&#xff0c;美国研究者开发的一个光子神经网络(photonic deep neural network&#xff0c;PDNN)&#xff0c;让图像识别仅需1纳秒。1纳秒是什…

LeetCode 1363. 形成三的最大倍数(贪心,难)

1. 题目 给你一个整数数组 digits&#xff0c;你可以通过按任意顺序连接其中某些数字来形成 3 的倍数&#xff0c;请你返回所能得到的最大的 3 的倍数。 由于答案可能不在整数数据类型范围内&#xff0c;请以字符串形式返回答案。 如果无法得到答案&#xff0c;请返回一个空…

Spring Boot中使用Spring Security进行安全控制

我们在编写Web应用时&#xff0c;经常需要对页面做一些安全控制&#xff0c;比如&#xff1a;对于没有访问权限的用户需要转到登录表单页面。要实现访问控制的方法多种多样&#xff0c;可以通过Aop、拦截器实现&#xff0c;也可以通过框架实现&#xff08;如&#xff1a;Apache…

这篇寒门博士论文致谢火了:回首望过去,可怜无数山

源 | 奔流新闻兰州晨报 记者 邢剑扬、安之若素德之至 微信平台、澎湃新闻“可怜无数山”近日&#xff0c;一位甘肃籍博士的论文致谢和回望“火”了&#xff0c;有网友称读后“泪眼婆娑&#xff0c;戳到了灵魂”&#xff0c;也有网友评价“一字一句&#xff0c;熠熠生辉”。“回…

Spring Boot中的事务管理

什么是事务&#xff1f; 我们在开发企业应用时&#xff0c;对于业务人员的一个操作实际是对数据读写的多步操作的结合。由于数据操作在顺序执行的过程中&#xff0c;任何一步操作都有可能发生异常&#xff0c;异常会导致后续操作无法完成&#xff0c;此时由于业务逻辑并未正确…

C++类对象排序operator重载操作

类内默认含有this指针&#xff0c;bool operator(const T& a)类外则需要写两个参数&#xff0c;bool operator(const T& a, const T& b) class People { public:string name;int id;People(string n, int i):name(n),id(i){}bool operator(const People& a){r…

鹅厂计算机视觉,世界第二??

编 | 好困 桃子源 | 新智元腾讯的计算机视觉能力首次进入全球Top2的评分排名&#xff01;Gartner最新发布的2022年度《Magic Quadrant for Cloud AI Developer Services》是业内权威的云计算评估报告之一&#xff0c;评估对象包括亚马逊、微软、谷歌等全球云厂商。在核心产品能…

Spring Boot中使用log4j实现http请求日志入mongodb

之前在《使用AOP统一处理Web请求日志》一文中介绍了如何使用AOP统一记录web请求日志。基本思路是通过aop去切web层的controller实现&#xff0c;获取每个http的内容并通过log4j将日志内容写到应用服务器的文件系统中。 但是当我们在集群中部署应用之后&#xff0c;应用请求的日…

程序员面试金典 - 面试题 01.02. 判定是否互为字符重排(哈希map)

1. 题目 给定两个字符串 s1 和 s2&#xff0c;请编写一个程序&#xff0c;确定其中一个字符串的字符重新排列后&#xff0c;能否变成另一个字符串。 示例 1&#xff1a; 输入: s1 "abc", s2 "bca" 输出: true 示例 2&#xff1a; 输入: s1 "abc&…

破局数据困境,迭代一年的终版解决方案竟是纯规则方法!

文 | Severus大家好&#xff0c;我是Severus&#xff0c;一个致力于做好中文自然语言理解的老程序员。一年前&#xff0c;我在萌屋的第一篇推文&#xff08;在错误的数据上&#xff0c;刷到 SOTA 又有什么意义&#xff1f;&#xff09;中&#xff0c;重点讲述了关系抽取任务所面…

程序员面试金典 - 面试题 01.03. URL化(字符串)

1. 题目 URL化。编写一种方法&#xff0c;将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符&#xff0c;并且知道字符串的“真实”长度。&#xff08;注&#xff1a;用Java实现的话&#xff0c;请使用字符数组实现&#xff0c;以便直接在数组上操作。…