欢迎光临散文网 会员登陆 & 注册

复盘|2023.1每日一题

2023-01-31 20:30 作者:UCLmsc  | 我要投稿

1.1题目 2351. 第一个出现两次的字母

【哈希表】用哈希表或数组记录每个字母出现的次数。空间复杂度O(C),C为字符串大小。

【位运算】用一个mask记录每个字母是否出现过,第i位表示第i个字母是否出现过。空间复杂度O(1)

1.2题目 1801. 积压订单中的订单总数

【优先队列(大小根堆) + 模拟】用优先队列(大小根堆)维护当前的积压订单,其中大根堆buy维护积压的采购订单,小根堆sell维护积压的销售订单。堆中每个元素是一个二元组(price,amount),表示价格为price的订单数量为amount。遍历订单数组orders,根据题意模拟即可。遍历结束后,将buy和sell中的订单数量相加,即为最终的积压订单数量。

1.3题目 2042. 检查句子中的数字是否递增

【模拟】将字符串s按空格分割成若干个单词。然后遍历每个单词,判断其是否为数字。只判断第一个字符即可。

1.4题目 1802. 有界数组中指定下标处的最大值

【二分】确定了nums[index]的值为x,此时我们可以找到一个最小的数组总和。也就是说,在ndx左侧的数组元素从x-1每次递减1,如果减到1后还有剩余元素,那么剩余的元素都为1;同样的,在imdx及右侧的数组元素从x也是每次递减1,如果减到1后还有剩余元素,那么剩余的元素也都为1。可以计算出数组的总和,如果总和小于等于nazSum,那么此时的x是合法的。随着x的增大,数组的总和也会增大,因此我们可以使用二分查找的方法,找到一个最大的且符合条件的x。

1.5题目 1803. 统计异或值在范围内的数对有多少

【哈希表】x ⊕ y = t 即 y = x ⊕ t。利用这个性质,统计nums每个数的出现次数,存在哈希表cnt中,然后遍历ct的每个键x,把cmt[x]·cnt[x⊕t]的结果记到答案中,由于遍历到等于x⊕t的键时又重复统计了一次,所以最后答案要除以2。将[low,high]分成若干区间,直接计算每个区间的答案。代码中high%2*cnt[(high-1)^x] 相当于 cnt[(high-1)^x] if high%2 else 0。

1.6题目 2180. 统计各位数字之和为偶数的整数个数

【暴力枚举】

【数学】位于区间[0, num]的整数可以分为两个部分:区间[10×y + 0, 10×y + x],如果y的各位数字之和为偶数,那么该区间内各位数字之和为偶数的整数个数为⌊x/2⌋+1,奇数为⌈x/2⌉;区间[0, 10×y + 0],注意到该区间的数可以表示为10×t+g的形式,其中0≤t<y且0≤g<10。固定住t时,如果t的各位数字之和为偶数,那么g为偶数的取值数目为5,奇数时类似,因此该区间内的各位数字之和为偶数的整数个数为y×5。注意到上述区间中我们多计入了整数0,因此结果应该是位于上述区间且各位数字之和为偶数的个数减1。

1.7题目 1658. 将 x 减到 0 的最小操作数

【双指针】把题目转换为从nums中移除一个最长的子数组,使得剩余元素和为x。即找到最长的子数组,其元素和为sum(nums)-x。

1.8题目 2185. 统计包含给定前缀的字符串

【遍历】按题意遍历每个字符串。

1.9题目 1806. 还原排列的最少操作步数

【模拟】直接按题意模拟,偶数arr[i] = perm[i/2],奇数arr[i] = perm[n/2 + (i-1)/2],不断循环,直到perm变回原始状态。

【数学】观察原排列对应的索引变化关系,·当0≤i<n/2时,此时g(i)=2i,当n/2≤i<n时,此时g(i)=2i-(n-1)。

1.10题目 753. 破解保险箱

【欧拉回路】

1.11题目 2283. 判断一个数的数字计数是否等于数位的值

【枚举】统计字符串每个数字出现的次数,枚举每个数字,判断其出现次数是否与其值相同。

1.12题目 1807. 替换字符串中的括号内容

【哈希表】将knowledge保存到哈希表dict中,遍历字符串。

1.13题目 2287. 重排字符形成目标字符串

【哈希表】哈希表统计s和target中每个字符出现的次数,对于target中每个字符,计算cnt1中该字符出现次数除以cnt2中该字符出现次数,取最小值。

1.14题目 1819. 序列中不同最大公约数的数目

【枚举 + 数学】对于数组nums的所有子序列,其最大公约数一定不超过数组中的最大值x。因此可以枚举[1,mx]中的每个数x,判断x是否为数组nums的子序列的最大公约数,如果是,则答案加一。那么问题转换为:判断x是否为数组nums的子序列的最大公约数。我们可以通过枚举x的倍数y,判断y是否在数组nums中,如果y在数组nums中,则计算y的最大公约数g,如果出现g=x,则x是数组nums的子序列的最大公约数。

1.15题目 2293. 极大极小游戏

【模拟】按题意模拟,直接在原数组上操作。

1.16题目 1813. 句子相似性 III

【双指针】i表示两个字符串数组从左开始最多有i个字符串相同。j表示剩下的字符串数组从右开始,最多有j个字符串相同。如果i+j正好是某个字符串数组的长度,那么原字符串就是相似的。

1.17题目 1814. 统计一个数组中好对子的数目

【哈希表】哈希表里存 x - rev(x) = y - rev(y)。遍历的同时添加。

1.18题目 1825. 求出 MK 平均值

【有序集合 + 队列】维护以下数据结构或变量:一个长度为m的队列q,队首元素为最早加入的元素,队尾元素为最近加入的元素;三个有序集合,分别为lo,mid,hi,其中lo和hi分别存最小的k个元素和最大的k个元素,mid存剩下的元素;变量s存mid中所有元素和。

1.19题目 2299. 强密码检验器 II

【模拟 + 位运算】按题意模拟,用mask记录密码是否包含小写、大写、数字和特殊字符。

1.20题目 1817. 查找用户活跃分钟数

【哈希表】用哈希表记录每个用户的去重操作时间,遍历哈希表统计每个用户活跃分钟数。

1.21题目 1824. 最少侧跳次数

【DP】定义f[i] [j]表示青蛙到达第i个点,且处于第j条跑道的最小侧跳次数。注意到青蛙起始位置处于第2条跑道(题目这里下标从1开始),因此f[0] [1] = 0, f[0] [0] = f[0] [2] = 1, ans = min(fi[n] [0], f[n] [1], f[n] [2])。对于i从1到n的每个位置,我们可以枚举青蛙当前所处的跑道j,如果obstacles[i]=j+1,说明第j条跑道上有障碍,此时f[i] [j]的值为正无穷;否则,青蛙可以选择不跳跃,此时f[j的值为f[i-1] [j],或者青蛙可以从其它跑道侧跳过来,此时f[i] [j] = min(f[i] [j], min(f[i] [0],f[i] [1],f[i] [2])+1)。

1.22题目 1815. 得到新鲜甜甜圈的最多组数

【贪心 + 状态压缩 + 记忆化搜索】设计一个函数dfs(state,mod),表示安排状态为state,且当前前缀余数为mod时,能使得多少组感到开心。那么我们在“初始答案”加上dfs(state,0),即为最终答案。函数dfs(state,mod)的实现逻辑如下:我们枚举1到batchSize-1的每一个余数i,如果余数i的数量不为0,那么我们可以将余数i的数量减去1,将当前前缀余数加上i并且对batch Size取模,然后递归调用函数dfs,求出子状态的最优解,取最大值即可。最后判断mod是否为0,如果为0,我们在最大值上加1后返回,否则直接返回最大值。

1.23题目 2303. 计算应缴税款总额

【模拟】遍历brackers,按题意模拟。

1.24题目 1828. 统计一个圆中点的数目

【枚举】2重循环,对于每个查询枚举所有点,依次判断是否在查询的圆中。

1.25题目 1632. 矩阵转换后的秩

【排序 + 并查集】简化情形:没有相同的元素。显然最小的元素的秩为1,第二小的元素要考虑是否和最小元素同行或同列。得到贪心解法:从小到大遍历元素,维护每行、每列的最大秩,该元素的秩即为同行、同列的最大秩加1。存在相同元素时则较为复杂,假设两个相同元素同行(或同列),那么就要考虑到两个元素分别对应的行(或列)的最大秩。同时还可能出现联动,比如元素a和b同行,b和c同列,那么要同时考虑这三个元素。想到并查集,用并查集将元素分为几个连通块,对于每个连通块,里面所有元素对应的行或列的最大秩加1,即为该连通块内所有元素的秩。

1.26题目 1663. 具有给定数值的最小字符串

【贪心】要求构造长度为k的字符串且字符的数值之和为n,要使得构造出的字符串字典序最小,可以贪心地从字符串左边起始位置开始构造,每次选择一个满足要求的最小字母。假设选了第i个位置的字符c,还剩下n-i个位置的字符这些字符的数值之和为k',字符最大为z',最小为a,可得n-i≤k'-c≤(n-i)×26,不等式转换,k'-(n-i)×26≤c≤k-(n-i),c最小值为1,得到c的合法取值范围为[max(1, k'-(n-i)×26), k-(n-i)]。

1.27题目 2309. 兼具大小写的最好英文字母

【哈希表 + 枚举】

【位运算】优化空间复杂度从O(C)到O(1)。用mask1和mask2分别记录s出现的小写和大写字母,mask1的第i位表示第i个小写字母是否出现,mask2的第i位表示第i个大写字母是否出现。mask1 & mask2,1是小写和大写同时出现,找到1的最高位,将其转换为对应的大写字母。

1.28题目 1664. 生成平衡数组的方案数

【枚举】枚举删除nums[i],平衡条件是:左侧奇位元素和+右侧偶位元素和 = 左侧偶位元素和 + 右侧奇位元素和。初始化四个变量,然后一次遍历nums[i],判断是否平衡。

1.29题目 2315. 统计星号

【模拟】定义一个遍历ok表示遇到*时能否计数,初始=1可以计数。遍历s,根据ok的值判断是否计数。如果遇到|,则ok的值取反。

1.30题目 1669. 合并两个链表

【双指针模拟】按题意模拟。

1.31题目 2319. 判断矩阵是否是一个 X 矩阵

【模拟】对于grid每个位置(i,j),如果满足i=j 或 i+j = n-1说明该点在对角线上。


复盘|2023.1每日一题的评论 (共 条)

分享到微博请遵守国家法律