Leetcode 3463. Check If Digits Are Equal in String After Operations II

news/2025/2/24 16:53:29
  • Leetcode 3463. Check If Digits Are Equal in String After Operations II
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3463. Check If Digits Are Equal in String After Operations II

1. 解题思路

这道题是题目Leetcode 3461的进阶版本,其实就是提高了对于算法效率的要求。

这道题我们实际就是要求s[:-1]s[1:]这两个字符串操作为最终一个字符之后的值是否相同。而将一个数字字符串按照给定操作变成最终一个字符,其原始字符串当中每一位参与的次数事实上就是一个杨辉三角,这个是很明显的。

因此,这里的问题事实上就变成了如何快速求出杨辉三角的第 n n n行的全部元素。考虑到我们最终是要考虑其个位数,因此事实上我们要求的是杨辉三角的第 n n n行上每一个元素的个位数,即其对 10 10 10的模。

有数学知识我们可以得到,杨辉三角的第 n n n行的第 k k k个元素事实上就是组合数 C n k C_n^k Cnk,但是当我们要求其对 10 10 10的模的时候,这个问题就变得有点复杂了。不过,考虑到 10 = 2 × 5 10 = 2 \times 5 10=2×5,然后由中国剩余定理,我们只需要分别求出 C n k C_n^k Cnk 2 2 2 5 5 5的余数,我们就必然可以一一对应的找出其对于 10 10 10的余数,这个简单关系如下:

nmod 2mod 5
000
111
202
313
404
510
601
712
803
914

但是,实际做题的时候我被卡在了这一步,后面没有搞定,但是问了一下deepseek之后,它给出了一个非常数学的解法,即使用Lucas定理进行快速求解。

我们首先给出Lucas定理的说明:

对于一个组合数 C n k C_n^k Cnk,要求其对于某一个素数 p p p的模,我们只需要将 n , k n, k n,k分别展开为 p p p进制数,即:
n = ∑ i = 0 m n i ⋅ p i k = ∑ i = 0 m k i ⋅ p i \begin{aligned} n &= \sum\limits_{i=0}^{m}n_i \cdot p^i \\ k &= \sum\limits_{i=0}^{m}k_i \cdot p^i \\ \end{aligned} nk=i=0mnipi=i=0mkipi
则我们有:
C n k ≡ Π i = 0 m C n i k i ( m o d   p ) C_n^k \equiv \mathop{\Pi}\limits_{i=0}^m C_{n_i}^{k_i} (mod\ p) Cnki=0ΠmCniki(mod p)

由此,我们就可以在任意 O ( l o g p n ) O(log_pn) O(logpn)的算法复杂度范围内求出任意组合数 C n k C_n^k Cnk关于 2 2 2 5 5 5的模了,进而,由上述模的对应关系,我们即可得到我们的最终答案。

2. 代码实现

给出python代码实现如下:

def comb_mod2(n, k):
    """ 计算 C(n, k) mod 2 """
    if k < 0 or k > n:
        return 0
    # 检查k的二进制位是否均为n对应位的子集
    return 0 if (k & ~n) else 1

# 预计算C(ni, ki) mod5的值(ni和ki为0-4)
mod5_comb_table = [
    [1, 0, 0, 0, 0],  # n=0
    [1, 1, 0, 0, 0],  # n=1
    [1, 2, 1, 0, 0],  # n=2
    [1, 3, 3, 1, 0],  # n=3
    [1, 4, 1, 4, 1],  # n=4(C(4,2)=6 mod5=1,C(4,3)=4 mod5=4)
]

def comb_mod5(n, k):
    """ 计算 C(n, k) mod 5 """
    result = 1
    while n > 0 or k > 0:
        ni = n % 5
        ki = k % 5
        if ki > ni:
            return 0
        # 查预计算表获取C(ni, ki) mod5
        result = (result * mod5_comb_table[ni][ki]) % 5
        n = n // 5
        k = k // 5
    return result

# 中国剩余定理映射表(a mod2,b mod5)→ 结果 mod10
crt_map = {
    (0, 0): 0,
    (0, 1): 6,
    (0, 2): 2,
    (0, 3): 8,
    (0, 4): 4,
    (1, 0): 5,
    (1, 1): 1,
    (1, 2): 7,
    (1, 3): 3,
    (1, 4): 9,
}

def get_element_mod10(i, j):
    """ 计算杨辉三角第i行第j个元素的个位数(索引从0开始) """
    if j < 0 or j > i:
        return 0
    a = comb_mod2(i, j)   # 计算模2
    b = comb_mod5(i, j)   # 计算模5
    return crt_map[(a, b)]

class Solution:
    def hasSameDigits(self, s: str) -> bool:
        n = len(s)
        weights = [get_element_mod10(n-2, i) for i in range(n-1)]
        
        def fn(s):
            ans = 0
            n = len(s)
            for i, ch in enumerate(s):
                digit = int(ch)
                ans = (ans + weights[i] * digit) % 10
            return ans
        
        return fn(s[:-1]) == fn(s[1:])

提交代码评测得到:耗时1443ms,占用内存19.2MB。


http://www.niftyadmin.cn/n/5864616.html

相关文章

蓝桥杯定时器实现led闪烁

step1.配置定时器&#xff0c;TIM1时高级定时&#xff0c;TIM2是通用定时器&#xff0c;用TIM2就行&#xff0c;用内部时钟源&#xff0c;记住相关公式&#xff0c;定时器中断配置时要使能&#xff0c;且生成代码后也要在mian中写使能函数 step2.写代码 配置生成代码后多出的…

阿里云如何协助解决操作系统兼容性问题

在云计算环境下&#xff0c;许多企业和开发者会遇到操作系统兼容性问题。例如&#xff0c;某些应用在 CentOS 或 Ubuntu 上运行时出现异常&#xff0c;影响业务的稳定性和效率。针对这些问题&#xff0c;阿里云提供了多种解决方案&#xff0c;帮助用户快速排查和解决兼容性难题…

ChātGPT赋能的“SolidWorks工具箱”:重塑3D设计效率新标杆

ChātGPT精心打造的“SolidWorks工具箱”正逐步成为3D设计领域中的一颗璀璨新星&#xff0c;其集高效、便捷与创新于一身&#xff0c;为用户带来了前所未有的设计体验。以下是对这一革命性工具箱的深度剖析与美化呈现&#xff1a; 一、核心功能&#xff1a;重塑设计流程&#x…

开源机器学习框架

TensorFlow 是由谷歌开发的一个开源机器学习框架&#xff0c;用于构建和训练深度学习模型。它的核心概念是张量&#xff08;Tensor&#xff09;&#xff0c;即多维数组&#xff0c;用于表示数据。TensorFlow 中的计算以数据流图的形式表示&#xff0c;图中的节点表示各种数学操…

下载CentOS 10

1. 进入官网&#xff1a;https://www.centos.org/ 2. 点击右上角的Download进入下载页面。 3. 选择对应的CPU架构&#xff0c;点击ISOs下面的Mirrors开始下载。

基于计算机视觉的手势识别:让机器理解我们的手势语言

友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…

低代码技术在医院的应用与思考

近年来&#xff0c;低代码这一概念在医疗信息化领域频繁出现。那么&#xff0c;低代码究竟是什么&#xff1f;它因何而生&#xff1f;在医院信息系统建设与运维中&#xff0c;低代码技术又有哪些适用的应用场景&#xff1f;对于用户而言&#xff0c;低代码技术又存在哪些有待改…

【机器学习】【KMeans聚类分析实战】用户分群聚类详解——SSE、CH 指数、SC全解析,实战电信客户分群案例

1.引言 在实际数据分析中&#xff0c;聚类算法常用于客户分群、图像分割等场景。如何确定聚类数 k 是聚类分析中的关键问题之一。本文将以“用户分群”为例&#xff0c;展示如何通过 KMeans 聚类&#xff0c;利用 SSE&#xff08;误差平方和&#xff0c;也称 Inertia&#xff…