双周赛:

5984. 拆分数位后四位数字的最小和

class Solution:def minimumSum(self, num: int) -> int:a, b, c, d = sorted(list(map(int, str(num))))return 10 * (a + b) + c + d

str(num)得到字符串序列,然后用map函数对序列的每个字符转换为数字,最后变为列表并且排序,最小的两个数 a、b 一定在十位所以乘10,个位则是 c 和 d。

5985. 根据给定数字划分数组

我的:

class Solution:def pivotArray(self, nums: List[int], pivot: int) -> List[int]:s = []e = []l = []for i in nums:if i < pivot:s.append(i)elif i == pivot:e.append(i)else:l.append(i)return s+e+l

大佬的:

class Solution:def pivotArray(self, nums: List[int], pivot: int) -> List[int]:ans = []for x in nums:if x < pivot:ans.append(x)for x in nums:if x == pivot:ans.append(x)for x in nums:if x > pivot:ans.append(x)return ans

区别不大,我是用三个列表分别记录小于、等于和大于 pivot 的数,然后把它们加起来。当然也可以循环 nums 三次,依次添加三种数进入 ans 中。

5986. 设置时间的最少代价

class Solution:def minCostSetTime(self, startAt: int, moveCost: int, pushCost: int, targetSeconds: int) -> int:ans = 10**9 for tmp in range(10000):  # 0000 到 9999 即所有情况a = list(map(int, str(tmp)))last = startAtneed = 0for x in a:if x != last:need += moveCostlast = xneed += pushCostif tmp // 100 * 60 + tmp % 100 == targetSeconds:  # 正好是目标时间ans = min(ans, need)return ans

这题的基本思路是分类讨论,但是有点复杂。大佬的思路简单粗暴,直接枚举四个数字的所有情况,计算其代价,如果这四个数字对应的正好是目标时间,则比较其代价与当前最少代价,更新最少代价。

5987. 删除元素后和的最小差值

class Solution:def minimumDifference(self, nums: List[int]) -> int:n = len(nums) // 3left = [0 for _ in range(3 * n + 1)]        #左侧最小的n个数的和right = [0 for _ in range(3 * n + 1)]       #右侧最大的n个数的和l_max = []                          #每次要删除那个最大的数for i in range(3 * n):left[i + 1] = left[i] + nums[i]heapq.heappush(l_max, -1 * nums[i]) # 最大堆if n <= i:    # 堆中最多有 n 个元素,一旦超过就开始 popleft[i + 1] -= -1 * l_max[0]   # 最大的数会被 pop,所以要减去heapq.heappop(l_max)  # 删除堆中最大的数r_min = []                          #每次要删除那个最小的数for i in range(3 * n - 1, -1, -1):right[i] = right[i + 1] + nums[i]heapq.heappush(r_min, nums[i])  # 最小堆if i < 2 * n:  # 堆中最多有 n 个元素,一旦超过就开始 popright[i] -= r_min[0]  # 最小的数会被 pop,所以要减去heapq.heappop(r_min)  # 删除堆中最小的数res = float('inf')for i in range(n, 2 * n + 1):  # 枚举分割点cur = left[i] - right[i]   # 前面部分减后面部分的值res = min(res, cur)return res

周赛

6000. 对奇偶下标分别排序

我的:

class Solution:def sortEvenOdd(self, nums: List[int]) -> List[int]:n = len(nums)odds = [nums[i] for i in range(n) if i % 2 == 1]evens = [nums[i] for i in range(n) if i % 2 == 0]odds.sort(reverse=True)evens.sort()ans = []for i in range(n):if i % 2 == 0:ans.append(evens[i // 2])else:ans.append(odds[(i-1) // 2])return ans

大佬的:

class Solution:def sortEvenOdd(self, nums: List[int]) -> List[int]:a = sorted(nums[0::2])b = sorted(nums[1::2], reverse=True)to_ret = []while len(a)+len(b) > 0 :if len(a) > 0 :to_ret.append(a.pop(0))if len(b) > 0 :to_ret.append(b.pop(0))return to_ret

优化点:1、取奇偶下标的元素不需要判断下标的奇偶,只需要设置步长为 2 ,起点为 0、1即可;2、排序应习惯用 sorted ,可以少写一行;3、要从头开始取元素,可以用 pop(0)

6001. 重排数字的最小值

我的:

class Solution:def smallestNumber(self, num: int) -> int:if num < 0:num_list = list(map(int, str(num)[1:]))num_list.sort(reverse=True)ans = 0for i in range(len(num_list)):ans = ans * 10 + num_list[i]ans = -anselif num == 0:ans = 0else:num_list = list(map(int, str(num)))num_list.sort()num_zeros = num_list.count(0)ans = 0if num_zeros == 0:for i in range(len(num_list)):ans = ans * 10 + num_list[i]else:ans = num_list[num_zeros]for i in range(num_zeros):ans = ans * 10for i in range(num_zeros+1, len(num_list)):ans = ans * 10 + num_list[i]return ans

大佬的:

class Solution:def smallestNumber(self, num: int) -> int:if num == 0 :return numif num < 0 :return -int(''.join(sorted(str(num)[1:], reverse=True)))if num > 0 :num = str(num)ct = len([1 for t in num if t == '0'])num = sorted([t for t in num if not t == '0'])return int(num[0] + '0'*ct + ''.join(num[1:]))

虽然都是分类讨论找规律,但是在表达上我还是不够简洁。实际上就三种情况:num 等于 0,则返回 0;num 小于 0,则按照数字从大到小返回;num 大于 0,则取最小的正数作为第一个数,然后跟 0,最后是其余正数。

6002. 设计位集

class Bitset:def __init__(self, size: int):self.size = sizeself.listt = [0] * sizeself.vcount = 0   # 记录 1 的个数self.isflip = False # 记录是否翻转def fix(self, idx: int) -> None:if not self.isflip :if not self.listt[idx] == 1 :self.vcount += 1self.listt[idx] = 1else :if not self.listt[idx] == 0 :self.vcount += 1self.listt[idx] = 0def unfix(self, idx: int) -> None:if not self.isflip :if not self.listt[idx] == 0 :self.vcount -= 1self.listt[idx] = 0else :if not self.listt[idx] == 1 :self.vcount -= 1self.listt[idx] = 1def flip(self) -> None:self.isflip = not self.isflipself.vcount = self.size - self.vcountdef all(self) -> bool:return self.vcount == self.sizedef one(self) -> bool:return self.vcount > 0def count(self) -> int:return self.vcountdef toString(self) -> str:if not self.isflip :return ''.join([str(t) for t in self.listt])else :return ''.join([str(1-t) for t in self.listt])

这题很容易超时,必须优化,而优化的点主要是两个:1、翻转操作不需要真的翻转,只需要用一个布尔标志记录是否处于翻转状态即可;2、由于初始时全为 0,所以在赋值 1 时可以用一个变量记录 1 出现的次数,这样就不用每次都计算有多少个 1 了。

6003. 移除所有载有违禁货物车厢所需的最少时间

正统的做法是动态规划,参考这篇题解

class Solution:def minimumTime(self, s: str) -> int:n = len(s)suf = [0] * (n + 1)for i in range(n - 1, -1, -1):suf[i] = suf[i + 1] if s[i] == '0' else min(suf[i + 1] + 2, n - i)ans = suf[0]pre = 0for i, ch in enumerate(s):if ch == '1':pre = min(pre + 2, i + 1)ans = min(ans, pre + suf[i + 1])return ans

另外有一种做法挺有意思,如图所示:

class Solution:def minimumTime(self, s: str) -> int:lists = [1 if i == "1" else -1 for i in s]for i in range(1, len(lists)):if lists[i - 1] < 0:lists[i] += lists[i - 1]return len(lists) + min(min(lists), 0)

Leetcode周赛复盘——第 71 场力扣双周赛与第 279 场力扣周赛相关推荐

  1. [LeetCode周赛复盘] 第 314 场周赛20221009

    [LeetCode周赛复盘] 第 314 场周赛20221009 一.本周周赛总结 二. [Easy] 6201. 找出前缀异或的原始数组 1. 题目描述 2. 思路分析 3. 代码实现 三.[Eas ...

  2. [LeetCode周赛复盘] 第 89 场双周赛20221015

    [LeetCode周赛复盘] 第 89 场双周赛20221015 一.本周周赛总结 二. [Easy] 6208. 有效时间的数目 1. 题目描述 2. 思路分析 3. 代码实现 三.[Medium] ...

  3. [LeetCode周赛复盘] 第 324 场周赛20221218

    [LeetCode周赛复盘] 第 324 场周赛20221218 一.本周周赛总结 二. [Easy] 6265. 统计相似字符串对的数目 1. 题目描述 2. 思路分析 3. 代码实现 三.[Med ...

  4. [LeetCode周赛复盘] 第 310 场周赛20220911

    [LeetCode周赛复盘] 第 310 场周赛20220911 一.本周周赛总结 二. [Easy] 6176. 出现最频繁的偶数元素 1. 题目描述 2. 思路分析 3. 代码实现 三.[Medi ...

  5. C#实现力扣双周赛算法题:以组为单位订音乐会的门票订购

    目录: 前言: 一,算法题目描述 二,基本概念理解: 三,例子引入分析 四,代码解释 (1)安排座位函数 (2)查询函数 (2)求出1到RPS内的最小下标 (3)gather函数 (4)scatter ...

  6. [acwing周赛复盘] 第 91 场周赛20230218

    [acwing周赛复盘] 第 91 场周赛20230218 一.本周周赛总结 二. 4861. 构造数列 1. 题目描述 2. 思路分析 3. 代码实现 三.4862. 浇花 1. 题目描述 2. 思 ...

  7. [LeetCode专场复盘] AutoX 安途智行专场竞赛

    [LeetCode专场复盘] AutoX 安途智行专场竞赛 一.本周周赛总结 二. AutoX-1. 网页瀑布流 1. 题目描述 2. 思路分析 3. 代码实现 三.AutoX-2. 蚂蚁王国的蜂蜜 ...

  8. 超级码力在线编程大赛初赛 第2场 1.三角魔法

    超级码力在线编程大赛初赛 第2场 1.三角魔法 题目链接 描述 小栖必须在一个三角形中才能施展魔法,现在他知道自己的坐标和三个点的坐标,他想知道他能否施展魔法 −1e9≤xi,yi≤1e9-1e9\l ...

  9. 超级码力在线编程大赛初赛第1场-1-树木规划题解

    目录 题目描述 示例 输入 输出 说明 分析 代码 动规 贪心 其他题目 题目描述 在一条直的马路上,有n棵树,每棵树有一个坐标,代表它们距离马路起点的距离. 如果每相邻的两棵树之间的间隔不小于d,那 ...

最新文章

  1. Unity接入安卓sdk查看应用内存占用
  2. 0227互联网新闻 | 腾讯与英特尔联合推出云游戏平台“腾讯即玩”;华为企业业务MWC现场发布数字平台...
  3. selenium模拟鼠标和键盘操作的基本方法
  4. python中dic_python之dic {字典}(重要指数*****)
  5. 深入理解HDFS:Hadoop分布式文件系统
  6. GB28181平台,监控接入从理论到实现
  7. 53. (待补) (使用单链表)实现简单的管理系统 MVC 将链表作为内存数据模型,将文件作为数据库,将终端作为交互界面。读文件生成 链表,修改链表写入文件。...
  8. 使用Logisim软件实现一位全加器,四位串行加法器,四位并行加法器。
  9. 大华条码秤开发之-快捷键传输
  10. 激光导航AGV的停车精度受环境变化的影响有多大?
  11. [转载]Html 特殊符号 让版权符号更美观_几何途行_新浪博客
  12. java normalize_node.js中的path.normalize方法使用说明
  13. python换照片底色_Python学习给照片换底色(蓝底换红底)
  14. pytorch gpu版本安装
  15. 跨部门工作安排与绩效考评解决方案
  16. excapeXML相关
  17. 前端播放大视频卡顿的解决(m3u8视频流)
  18. 如何让一个函数返回多个返回值
  19. android mp3音量增大,嫌弃安卓音量太小?学会这个技巧,音量扩大双倍
  20. 机房服务器招标文件,网络服务器中心机房招标技术文件.doc

热门文章

  1. php自动加载机制的实现
  2. 在微信小程序中使用“随机键盘”
  3. ArcGIS实验教程——实验三十五:ArcGIS Model Builder与空间建模原理、案例详解
  4. 空间数据库Spatial Tools的使用
  5. Android之提示androidx.recyclerview.widget.LinearLayoutManager@51ddcd is already attached to a RecyclerV
  6. Android之部分手机(oppo r9s)安装app出现崩溃问题解决办法
  7. Android之Unable to execute dex: Multiple dex files define 解决方法
  8. 关于nginx为站点绑定域名以及绑定多个域名
  9. 软件项目组织管理(七)项目成本管理
  10. 抽走超大桌布之后保持桌面物体不掉,需要多快的速度?