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

news2024/11/6 3:00:24

 需要多掌握解题套路

 比赛地址

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

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

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

相关文章

while猜数字实例——C++版

案例描述&#xff1a;系统随机生成一个1到100之间的数字&#xff0c;玩家进行猜测&#xff0c;如果猜错&#xff0c;提示玩家数字过大或过小&#xff0c;如果猜对恭喜玩家胜利并退出游戏。 逻辑框图&#xff1a; #include<bits/stdc.h> using namespace std; int main()…

Redis 持久化——AOF

文章目录 为什么需要AOF?概念持久化查询和设置1. 查询AOF启动状态2. 开启AOF持久化2.1 命令行启动AOF2.2 配置文件启动 AOF 3. 触发持久化3.1 自动触发3.3 手动触发 4. AOF 文件重写4.1 什么是AOF重写&#xff1f;4.2 AOF 重写实现4.3 AOF 重写流程 5. 配置说明6. 数据恢复6.1…

数据结构和算法-交换排序中的快速排序(演示过程 算法实现 算法效率 稳定性)

文章目录 总览快速排序&#xff08;超级重要&#xff09;啥是快速排序演示过程算法实现第一次quicksort函数第一次partion函数到第一次quicksort的第一个quicksort到第二次quicksort的第一个quicksort到第二次quicksort的第二个quicksort到第一次quicksort的第二个quicksort到第…

UnityVR入门之六 如何让3DUI层级在场景模型之上

一、问题来源 根据 UnityVR入门之五 射线检测交互-CSDN博客 这一章节我们了解到VR要与UI交互需要将Canvas设置为World Space属性&#xff0c;然后使用碰撞盒的方式进行射线交互。 正常我们ui是始终叠加在3d场景之上的&#xff0c;如此设置当ui与场景模型相交就会遮挡穿模 二、解…

【Java集合篇】负载因子和容量的关系

负载因子和容量有什么关系 ✔️典型解析✔️loadfactor为啥默认是0.75F&#xff0c;不是1呢?✔️为什么HashMap的默认负载因子设置成0.75✔️0.75的数学依据是什么✔️0.75的必然因素 ✔️HashMap的初始值设为多少合适? ✔️典型解析 HashMap 中有几个属性&#xff0c;如 cap…

使用qtquick调用python程序,pytorch

一. 内容简介 使用qtquick调用python程序 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3pytorch 安装pytorch(http://t.csdnimg.cn/GVP23) 2.4QT 5.14.1 新版QT6.4,&#xff0c;6.5在线安装经常失败&#xff0c;而5.9版本又无法编译64位程序&#xf…

云尚办公项目学习

完整的笔记可以参考这个专栏&#xff0c;写的挺详细的&#xff1a;云尚办公课件笔记&#xff0c;come on boy 文章目录 form-create表设计步骤1&#xff0c;创建审批类型2&#xff0c;创建审批类型下的审批模板3&#xff0c;为指定的审批模板设置模板名称&#xff0c;表单项&am…

Python笔记01-你好Python

文章目录 Python简介环境安装Hello world开发工具 Python简介 python的诞生 1989年&#xff0c;为了打发圣诞节假期&#xff0c;Gudio van Rossum吉多 范罗苏姆&#xff08;龟叔&#xff09;决心开发一个新的解释程序&#xff08;Python雏形&#xff09; 1991年&#xff0c;第…

CSS 压重按钮 效果

<template><view class="cont"><div class="container"><div class="pane"><!-- 选项1 --><label class="label" @click="handleOptionClick(0)":style="{ color: selectedOption ==…

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

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

Open CASCADE学习|入门Hello world

目录 1、新建项目 2、写代码 3、配置 3.1配置头文件 3.2配置静态库文件 3.3配置动态库文件 4、编译运行 1、新建项目 新建一个Win32控制台应用程序&#xff0c;取名为HelloWorld&#xff0c;如下图所示&#xff1a; 2、写代码 测试所用的代码如下&#xff1a; // Use T…

数据分析基础之《numpy(6)—IO操作与数据处理》

了解即可&#xff0c;用panads 一、numpy读取 1、问题 大多数数据并不是我们自己构造的&#xff0c;而是存在文件当中&#xff0c;需要我们用工具获取 但是numpy其实并不适合用来读取和处理数据&#xff0c;因此我们这里了解相关API&#xff0c;以及numpy不方便的地方即可 2…

Rockchip平台双屏异显功能实现(基于Android13)

Rockchip平台双屏异显功能实现(基于Android13) 1. 异显实现方案 Rockchip SDK平台支持两种不同的异显方案&#xff1a;Android Presentation和Android Activity指定屏幕启动。 使用Android Presentation方案&#xff0c;需要在APP开发中调用相应接口以使指定视图&#xff08…

ATTCK视角下的信息收集:主机发现

目录 1、利用协议主动探测主机存活 利用ICMP发现主机 利用ARP发现主机 利用NetBIOS协议发现主机 利用TCP/UDP发现主机 利用DNS协议发现主机 利用PRC协议发现主机程序 2、被动主机存活检测 利用Browser主机探测存活主机 利用ip段探测主机存活 利用net命令探测主机存活…

论文笔记 Understanding Electricity-Theft Behavior via Multi-Source Data

WWW 2020 oral 1 INTRO 1.1 背景 1.1.1 窃电 窃电&#xff08;electricity theft&#xff09;指用户为了逃避电费而进行非法操作的一种行为 常用的反窃电方法可分为两类&#xff1a; 基于硬件驱动的反窃电方法 ​​​​​​​电表开盖检测、集中器检测。。。。 硬件驱动的…

18.标题统计

题目 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String str sc.nextLine();int res 0;for(int i0;i<str.length();i) {char c str.charAt(i);if(c! && c!\n) {res;}}System.o…

Simply主题 简约风格的Emlog博客模板 响应式布局

主题介绍 Simply是一款简约风格的Emlog博客模板&#xff0c;响应式布局、界面简单大方&#xff0c;实用性强&#xff01; 支持夜间模式&#xff0c;采用localStorage存储配置。IOS系统下支持随系统自动切换浅/深色模式。 文章页支持显示文章字数及阅读时间。 支持http/https …

MCS-51单片机的基本结构

目录 一.单片机的逻辑结构 1.单片机的基本结构 2.引脚 3.中断系统 4.时钟电路 5.时序 6.典型指令的取指、执行时序 7.80C51中定时器/计数器 二.单片机的复位 三.程序的执行方式 1.单步执行方式 2.低功耗操作方式 3.EPROM编程和校验方式 首先补充一个知识点&#x…

JVM工作原理与实战(八):类加载器的分类

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、类加载器介绍 二、类加载器的分类 1.Java代码实现的类加载器 2.Java虚拟机底层源码实现的类加载器 3.默认的类加载器层次&#xff08;JDK8及之前的版本&#xff09; 总结 前言…

听GPT 讲Rust源代码--compiler(15)

File: rust/compiler/rustc_arena/src/lib.rs 在Rust源代码中&#xff0c;rustc_arena/src/lib.rs文件定义了TypedArena&#xff0c;ArenaChunk&#xff0c;DroplessArena和Arena结构体&#xff0c;以及一些与内存分配和容器操作相关的函数。 cold_path<F: FnOnce,drop,new,…