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

 需要多掌握解题套路

 比赛地址

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

class Solution:
    def missingInteger(self, nums: List[int]) -> int:
           # Step 1: Find the longest consecutive prefix
            i = 0  
            for i in range(1, len(nums)):
                if nums[i] != nums[i - 1] + 1:
                    break
            else:
                # Handle the case where the entire array is a consecutive prefix
                i += 1

            # Step 2: Calculate the sum of the longest consecutive prefix
            prefix_sum = sum(nums[:i])

            # Step 3: Find the smallest missing integer greater than the prefix sum
            missing = prefix_sum
            while missing in nums:
                missing += 1

            return missing

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

class Solution:
    def minOperations(self, nums: List[int], k: int) -> int:
            # Step 1: Calculate the XOR of all elements in nums
            m = 0
            for num in nums:
                m ^= num

            # Step 2: Count the number of different bits between m and k
            xor = m ^ k
            count = 0
            while xor:
                count += xor & 1
                xor >>= 1

            return 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 values

            while queue:
                current, operations = queue.popleft()

                # If we have reached the target, return the number of operations
                if current == y:
                    return operations

                # Ensure we do not visit the same number again
                if current in visited:
                    continue
                visited.add(current)

                # If current is divisible by 11, enqueue the divided result
                if current % 11 == 0:
                    queue.append((current // 11, operations + 1))

                # If current is divisible by 5, enqueue the divided result
                if current % 5 == 0:
                    queue.append((current // 5, operations + 1))

                # Always enqueue the results of adding or subtracting 1
                queue.append((current + 1, operations + 1))
                queue.append((current - 1, operations + 1))

            # If y is never reached, return -1 or some error value
            return -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函数,使用缓存装饰器以优化性能
        @cache
        def dfs(i, is_limit, t):
            # 如果剩余数字的长度小于后缀s的长度,则不可能构成有效数字
            if len(t) < n:
                return 0
            
            # 当剩余的位数等于后缀s的长度,只能填入s
            if len(t) - i == n:
                # 如果当前是受限状态,则检查t的剩余部分是否大于等于s
                if is_limit:
                    return int(s <= t[i:])
                else:
                    # 如果不受限,只有一种情况,即填入s
                    return 1
            
            res = 0
            
            start = 0
            # 如果当前受限,则枚举的数字不能超过t的当前位数字
            if is_limit:
                end = int(t[i])
            else:
                end = 9
            
            # 枚举的数字还需受限于limit
            end = 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Zookeeper三节点搭建

一、安装前准备 安装JDK&#xff08;之前已经安装了&#xff09; 拷贝apache-zookeeper-3.5.7-bin.tar.gz安装包到Linux系统下 解压到指定目录 在/opt/module/zookeeper-3.5.7/这个目录下创建zkData&#xff0c;在/opt/module/zookeeper-3.5.7/zkData目录下创建一个myid的…

第 121 场 LeetCode 双周赛题解

A 大于等于顺序前缀和的最小缺失整数 模拟&#xff1a;先求最长顺序前缀的和 s s s &#xff0c;然后从 s s s 开始找没有出现在 n u m s nums nums 中的最小整数 class Solution { public:int missingInteger(vector<int> &nums) {unordered_set<int> vis(…

MySQL数据管理(二)

DML语言 DML &#xff08;数据操作语&#xff09;&#xff1a;用于操作数据库对象中所包含的数据 DML包括&#xff1a; INSERT&#xff08;添加数据语句&#xff09;UPDATE&#xff08;更新数据语句&#xff09;DELETE&#xff08;删除数据语句&#xff09; 一、添加数据 …

Matlab三维绘图

绘制三维图plot3 t0:pi/50:10*pi; xsin(t); ycos(t); zt; plot3(x,y,z); 产生栅格数据点meshgrid 这个接口在绘制三维图像里面相当重要&#xff0c;很多时候要将向量变成矩阵才能绘制三维图。 x0:0.5:5; y0:1:10; [X,Y]meshgrid(x,y); plot(X,Y,o); x和y是向量&#xff0c;…

qt三大控件

1.QListWidget控件 先在ui界面将 QListWidget拖出来竖直对齐 再去代码中实现文本插入 两种插入方式 方法1 //listWidget使用 有左右中间对齐需求QListWidgetItem * itemnew QListWidgetItem("床前明月光"); // //上面只是独立的一句话,没有关联起来ui-&g…

Android AAudio

文章目录 基本概念启用流程基本流程HAL层对接数据流计时模型调试 基本概念 AAudio 是 Android 8.0 版本中引入的一种音频 API。 AAudio 提供了一个低延迟数据路径。在 EXCLUSIVE 模式下&#xff0c;使用该功能可将客户端应用代码直接写入与 ALSA 驱动程序共享的内存映射缓冲区…

HarmonyOS4.0系统性深入开发15Want概述

Want概述 Want的定义与用途 Want是对象间信息传递的载体&#xff0c;可以用于应用组件间的信息传递。其使用场景之一是作为startAbility()的参数&#xff0c;包含了指定的启动目标以及启动时需携带的相关数据&#xff0c;如bundleName和abilityName字段分别指明目标Ability所…

模拟算法(模拟算法 == 依葫芦画瓢)万字

模拟算法 基本思想引入算法题替换所有的问号提莫攻击Z字形变换外观数列数青蛙 基本思想 模拟算法 依葫芦画瓢解题思维要么通俗易懂&#xff0c;要么就是找规律&#xff0c;主要难度在于将思路转换为代码。 特点&#xff1a;相对于其他算法思维&#xff0c;思路比较简单&#x…

线性代数 --- 为什么LU分解中L矩阵的行列式一定等于正负1?

以下是关于下三角矩阵L的行列式一定等于-1的一些说明 笔者的一些话(写在最前面)&#xff1a; 这是一篇小文&#xff0c;是我写的关于求解矩阵行列式的一篇文章中的一部分。之所以把这一段专门提溜出来&#xff0c;是因为这一段相对于原文是可以完全独立的&#xff0c;也是因为我…

YOLOv5改进 | 检测头篇 | 增加辅助检测头利用AFPN改进Head(附详细修改教程)

一、本文介绍 本文给大家带来的改进机制是利用今年新推出的AFPN(渐近特征金字塔网络)来优化检测头,AFPN的核心思想是通过引入一种渐近的特征融合策略,将底层、高层和顶层的特征逐渐整合到目标检测过程中。这种渐近融合方式有助于减小不同层次特征之间的语义差距,提高特征…

在VM下使用Composer完成快照方式的软件制作

Composer允许您构建软件、应用程序、偏好设置文件或是文档的安装包&#xff0c;安装包可以部署到远程电脑或是作为镜像流程的一部分。构建软件包的第一步就是创建包源&#xff0c;根据要打包的软件&#xff0c;Composer允许您监视软件的安装和使用驱动器上已存在的文件来创建包…

python豆瓣实例,抓取多页数据-应用到知识点:随时数,xpath,间隔请求sleep

源代码: <!DOCTYPE html> <html lang="zh-CN" class="ua-windows ua-webkit"> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="renderer" content=&q…

计算机网络-VLAN原理与配置

之前我们学习了以太网的基础知识&#xff0c;了解了网络交换设备的发展&#xff0c;交换机的工作原理&#xff0c;广播域和冲突域。 一、概述 还简单了解了以太网的CSMA/CD通讯机制&#xff0c;以太网是建立在CSMA/CD (Carrier Sense Multiple Access/Collision Detection&…

【LMM 014】NExT-GPT:能够输入和生成任意模态的多模态大模型

论文标题&#xff1a;NExT-GPT:Any-to-Any Multimodal Large Language Model 论文作者&#xff1a;Shengqiong Wu, Hao Fei*, Leigang Qu, Wei Ji, Tat-Seng Chua 作者单位&#xff1a; NExT Lab, National University of Singapore 论文原文&#xff1a;https://arxiv.org/abs…

学习笔记——C++运算符之逻辑运算符

作用&#xff1a;用于根据表达式的真值返回真值或假值 逻辑运算符有以下符号&#xff1a; #include<bits/stdc.h> using namespace std; int main(){// 逻辑运算符 非 !int a10;//在c中&#xff0c;除了0均是真 cout<<!a<<endl;//0 cout<<!!a<<…

《MySQL系列-InnoDB引擎06》MySQL锁介绍

文章目录 第六章 锁1 什么是锁2 lock与latch3 InnoDB存储引擎中的锁3.1 锁的类型3.2 一致性非锁定读3.3 一致性锁定读3.4 自增长与锁3.5 外键和锁 4 锁的算法4.1 行锁的三种算法4.2 解决Phantom Problem 5 锁问题5.1 脏读5.2 不可重复读5.3 丢失更新 6 阻塞7 死锁 第六章 锁 开…

解决使用localhost或127.0.01模拟CORS失效

解决使用localhost或127.0.01模拟CORS失效 前言问题发现问题解决 前言 CORS (Cross-Origin Resource Sharing) 指的是一种机制&#xff0c;它允许不同源的网页请求访问另一个源服务器上的某些资源。通常情况下&#xff0c;如果 JavaScript 代码在一个源中发起了 AJAX 请求&…

CentOS使用docker安装mysql并使用navicat 远程链接

这篇文章没用开启mysql的挂载功能&#xff0c;如果想开启的话可以和我的下篇文章结合着看。 CentOS中开启mysql挂载-CSDN博客 docker在之前的文章中已经安装完成了 这里输入命令查询已被上传的MySQL镜像 docker search mysql这里stars代表点赞数&#xff0c;official代表官…

MvvmToolkit的使用

背景&#xff1a;MvvmLight不更新了&#xff0c;用Toolkit代替 1、首先下载好社区版本的NuGet包 2、ViewModel中需要继承ObservableObject&#xff0c;查看ObservableObject可以看到里面有实现好InotifyPropertyChanged。 3、对于属性的set&#xff0c;可以简写成一行&#xff…

weak_ptr如何能做到解决循环引用又能传递参数呢?

引子&#xff1a;今天在看CLR via C#的时候看到C#的垃圾回收算法--引用跟踪算法的时候想到以下几个问题。 一、引用计数法存在的问题 一般引用计数法存在的问题就是不好处理循环引用的问题&#xff0c;但是C不是有weak_ptr吗&#xff1f; 这个引用跟踪的垃圾回收算法看起来还…