第121场双周赛题解:揭秘算法竞赛中的数位挑战与解题策略

 需要多掌握解题套路

 比赛地址

100157. 大于等于顺序前缀和的最小缺失整数

class Solution:def missingInteger(self, nums: List[int]) -> int:# Step 1: Find the longest consecutive prefixi = 0  for i in range(1, len(nums)):if nums[i] != nums[i - 1] + 1:breakelse:# Handle the case where the entire array is a consecutive prefixi += 1# Step 2: Calculate the sum of the longest consecutive prefixprefix_sum = sum(nums[:i])# Step 3: Find the smallest missing integer greater than the prefix summissing = prefix_sumwhile missing in nums:missing += 1return missing

100168. 使数组异或和等于 K 的最少操作次数

class Solution:def minOperations(self, nums: List[int], k: int) -> int:# Step 1: Calculate the XOR of all elements in numsm = 0for num in nums:m ^= num# Step 2: Count the number of different bits between m and kxor = m ^ kcount = 0while xor:count += xor & 1xor >>= 1return count

100159. 使 X 和 Y 相等的最少操作次数 

class Solution:def minimumOperationsToMakeEqual(self, x: int, y: int) -> int:# Queue will contain pairs (current_value, operations_count)queue = deque([(x, 0)])visited = set() # To keep track of already visited valueswhile queue:current, operations = queue.popleft()# If we have reached the target, return the number of operationsif current == y:return operations# Ensure we do not visit the same number againif current in visited:continuevisited.add(current)# If current is divisible by 11, enqueue the divided resultif current % 11 == 0:queue.append((current // 11, operations + 1))# If current is divisible by 5, enqueue the divided resultif current % 5 == 0:queue.append((current // 5, operations + 1))# Always enqueue the results of adding or subtracting 1queue.append((current + 1, operations + 1))queue.append((current - 1, operations + 1))# If y is never reached, return -1 or some error valuereturn -1

100163. 统计强大整数的数目

  1. 函数 numberOfPowerfulInt

    • 输入参数:整数 start, finish, limit 和字符串 s
    • 返回值:区间 [start, finish] 内符合条件的数字数量。
    • 实现:调用 dfs 函数两次来计算不超过 finishstart - 1 的符合条件的数字数量,然后相减得到结果。
  2. 数位 DP 函数 dfs

    • 输入参数:当前处理的数位索引 i,一个布尔值 is_limit 表示当前是否受到上界 t 的限制,以及当前考虑的数的字符串表示 t
    • 返回值:在给定限制下,从当前位开始能构造出的符合条件的数字数量。
    • 实现:
      • 首先检查边界条件,当剩下的位数等于 s 的长度时,只能填入 s,并根据是否受限制判断是否可行。
      • 对于每一位,根据是否受限制和 limit 的值确定当前位的可能数字范围。
      • 递归地调用 dfs 来处理下一位,并累计所有可能性的总数。
  3. 递归和缓存

    • dfs 函数使用递归来处理每一位,通过 @cache 装饰器对函数结果进行缓存,以避免重复计算相同状态的结果,从而提高性能。

总体而言,这个实现通过精确地处理每一位的可能性,并利用递归和函数缓存来有效地处理大范围的数据。这种方法在处理复杂的数位相关问题时非常有效,尤其是在涉及大数字时。

class Solution:def numberOfPowerfulInt(self, start: int, finish: int, limit: int, s: str) -> int:n = len(s)# 数位dp函数,使用缓存装饰器以优化性能@cachedef dfs(i, is_limit, t):# 如果剩余数字的长度小于后缀s的长度,则不可能构成有效数字if len(t) < n:return 0# 当剩余的位数等于后缀s的长度,只能填入sif len(t) - i == n:# 如果当前是受限状态,则检查t的剩余部分是否大于等于sif is_limit:return int(s <= t[i:])else:# 如果不受限,只有一种情况,即填入sreturn 1res = 0start = 0# 如果当前受限,则枚举的数字不能超过t的当前位数字if is_limit:end = int(t[i])else:end = 9# 枚举的数字还需受限于limitend = min(end, limit)# 枚举当前位可能的数字,并递归处理下一位for num in range(start, end+1):res += dfs(i+1, is_limit and num == int(t[i]), t)return res# 计算区间[start, finish]内符合条件的数字数量return dfs(0, True, str(finish)) - dfs(0, True, str(start-1))

is_limit and num == int(t[i]):这个表达式决定了在下一次递归调用中,是否仍然受到上界 t 的限制。

  • 如果当前位 num 等于 t 在位置 i 的数字,并且之前的位置已经受到限制(is_limitTrue),那么在下一位上仍然受到限制。
  • 如果 num 不等于 t[i] 或之前的位置没有受到限制,那么在下一位上不再受到限制。

下面举例说明这个过程: 

假设我们有 t = "5432"limit = 9,并且当前我们在第二位(假设索引从 0 开始),即 i = 1,之前的数位值是 5,与 t[0] 相等,所以到目前为止我们是受限的(is_limit = True)。现在我们要决定第二位 i = 1 的值。

  1. 如果我们选择 num = 4(即等于 t[1]):

    • 在下一次递归调用中,我们仍然受限于 t,因为到目前为止构造出的数字仍然与 t 的前缀相匹配。所以,is_limit 仍然为 True
  2. 如果我们选择 num = 3(即小于 t[1]):

    • 在这种情况下,我们已经偏离了 t 的对应位置。即使之前是受限的,现在我们可以认为后续的数位不再受到 t 的限制。因此,在下一次递归调用中,is_limit 将变为 False
    • 这意味着对于这个位置及后续位置上的数位,我们可以自由地选择任何不超过 limit 的数字,而不用担心超过 t
  3.  num > t[i] 的情况不会发生,在之前的判断中已经被排除了
# 如果当前受限制(is_limit),则枚举的数字不能超过t的当前位数字
if is_limit:end = int(t[i])
else:end = 9

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

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

相关文章

条件竞争之文件上传

一、条件竞争介绍 条件竞争,在程序员日常的Web应用开发中&#xff0c;通常不如其他漏洞受到的关注度高。因为普遍的共识是&#xff0c;条件竞争是不可靠的&#xff0c;大多数时候只能靠代码审计来识别发现&#xff0c;而依赖现有的工具或技术很难在黑盒灰盒中识别并进行攻击。…

项目实战:数字孪生可视化大屏幕,实现生产过程实时监控

项目介绍 智慧工厂数据可视化系统&#xff0c;融合工业大数据、物联网、人工智能等各类信息技术&#xff0c;整合厂区现有信息系统的数据资源&#xff0c;实现数字孪生工厂、设备运维监测、智能管网监测、综合安防监测、便捷通行监测、能效管理监测、生产管理监测、仓储物流监…

SiC电机控制器(逆变器)发展概况及技术方向

SiC电机控制器&#xff08;逆变器&#xff09;发展概况及技术方向 1.概述2.电动汽车动力系统设计趋势3.栅极驱动器和驱动电源配置4.结论 tips&#xff1a;资料来自网上搜集&#xff0c;仅供学习使用。 1.概述 2022年到2023年&#xff0c;第三代半导体碳化硅被推上了新的热潮。…

使用邮箱发送验证码前端完成登录

前言 在前一篇使用C#发送邮箱验证码已经完成使用.net core web api写了完成往登录邮箱发送验证码的接口。现在就用前端调用接口模拟登录功能。 接口 public class ApiResp{public bool Success { get; set; }public int Code { get; set; }public int count { get; set; }pu…

案例介绍|钡铼助力2023年全国职业院校技能大赛工业网络智能控制与维护赛项

如今&#xff0c;越来越多的企业开始意识到数字制造和工业物联网已经成为工业自动化中大规模生产的核心驱动力。这其中&#xff0c;工业网络作为基础设施&#xff0c;是实现工厂设备联网与数据采集&#xff0c;建设数字工厂的基础和前提&#xff0c;甚至成为关乎数字工厂能否真…

【AIGC工具】我找到了使用大模型问答的最短路径!

大家好&#xff0c;我是豆小匠~ 好久没介绍提高效率的工具啦&#xff0c;这次来介绍一个UTools的骚操作&#xff0c;可以极速打开LLM进行提问&#xff01; 完成后的效果是&#xff1a; 快捷键调出输入框&#xff1b;2. 输入问题&#xff1b;3. 选择模型&#xff1b;4. 回车提…

Embedded-Project项目介绍

Embedded-Project项目介绍 Server后端项目后端启动连接数据库启动时可能遇到的问题架构介绍 web前端项目前端启动启动时可能遇到的问题架构介绍 前后端分离开发流程 项目地址&#xff1a; https://github.com/Catxiaobai/Embedded-Project Server后端项目 系统后端项目&#…

C++ 类的内存分布

文章目录 1 . 前言2 . 无继承&#xff0c;无虚函数3 . 无继承&#xff0c;有虚函数4 . 单一继承&#xff0c;无虚函数5 . 单一继承&#xff0c;有虚函数&#xff0c;虚析构6 . 多重继承7 . 菱形继承8 . 虚拟继承9 . 总结 【极客技术传送门】 : https://blog.csdn.net/Engineer_…

【机器学习】循环神经网络(二)-LSTM示例(keras)国际航空乘客问题的回归问题...

使用 Keras 在 Python 中使用 LSTM 循环神经网络进行时间序列预测 国际航空乘客问题的回归问题 这个文件是一个CSV格式的数据集&#xff0c;它包含了从1949年1月到1960年12月的每个月的国际航空乘客的总数&#xff08;以千为单位&#xff09;。第一行是列名&#xff0c;分别是&…

案例099:基于微信小程序的外卖小程序的研究与开发

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

期货日数据维护与使用_日数据维护_日数据更新

目录 写在前面&#xff1a; 下载日数据 下载“新增合约”日数据 下载“待更新合约”日数据 日数据文件 “选择日数据所在目录”按钮点击 “执行”按钮点击 sqlite3代码 按钮点击后执行的代码 子线程代码 写在前面&#xff1a; 本文默认已经创建了项目&#xff0c;如…

pytorch集智-2单车预测器

完整代码在个人主页简介链接pytorch路径下可找到 1 单车预测器1.0 1.1 人工神经元 对于sigmoid函数来说&#xff0c;w控制函数曲线的方向&#xff0c;b控制曲线水平方向位移&#xff0c;w控制曲线在y方向的幅度 1.2 多个人工神经元 模型如下 数学上可证&#xff0c;有限神经…