【字符串】788. 旋转数字(普通方法+DP)

LeetCode 788. 旋转数字 详细技术解析(三种解法) 这篇文章详细解析了LeetCode 788题"旋转数字"的三种解法。题目要求统计1到n区间内所有"好数"的数量,即旋转180度后能形成有效且不同于原数的数字。文章首先明确题目定义和规则,指出好数必须不包含3、4、7这些无效数字,且至少包含2、5、6、9这些可变数字。 文章提供了三种解法:基础暴力枚举法通过数学取模逐位校验;优化的字符串解法利用字符串转换简化逻辑;动态规划解法通过状态记录实现线性时间复杂度。三种方法各具特色,暴力解法适合快速解题 阅读详情

【题目】
我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。
如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己;2 和 5 可以互相旋转成对方(在这种情况下,它们以不同的方向旋转,换句话说,2 和 5 互为镜像);6 和 9 同理,除了这些以外其他的数字旋转以后都不再是有效的数字。
现在我们有一个正整数 N, 计算从 1 到 N 中有多少个数 X 是好数?
示例
输入: 10
输出: 4
解释:
在[1, 10]中有四个好数: 2, 5, 6, 9。
注意 1 和 10 不是好数, 因为他们在旋转之后不变。
【代码】
【Python】
【数字转换】
执行用时:
128 ms, 在所有 Python3 提交中击败了31.69%的用户
内存消耗:
14.9 MB, 在所有 Python3 提交中击败了21.47%的用户

class Solution:
    def rotatedDigits(self, N: int) -> int:
        # 2 he 5 ; 6 he 9
        # 0 1 8 旋转之后是自身
        helpstr=['=','=','-','*','*','-','-','*','=','-']
        cnt=0
        for i in range(1,N+1):
            flag=1
            change=0
            temp=i
            while temp:
                if helpstr[temp%10]=='*':
                    flag=0
                    break
                elif helpstr[temp%10]=='-':
                    change=1
                temp=int(temp/10)
            if flag and change:
                cnt+=1
        return cnt

【集合】

class Solution:
    def rotatedDigits(self, N: int) -> int:
        # 2 he 5 ; 6 he 9
        # 0 1 8 旋转之后是自身
        helpstr=['=','=','-','*','*','-','-','*','=','-']
        cnt=0
        set_zishen= {"0","1","8"}
        set_change= {"2","5","6","9"}
        set_wuxiao= {"3","4","7"}
        set_help={1,2,3}
        for i in range(1,N+1):
            temp=set(str(i))
            if len(temp.intersection(set_wuxiao))==0 and len(temp.intersection(set_change))!=0:
                cnt+=1
        return cnt

【暴力】

class Solution(object):
    def rotatedDigits(self, N):
        ans = 0
        # For each x in [1, N], check whether it's good
        for x in range(1, N+1):
            S = str(x)
            # Each x has only rotateable digits, and one of them
            # rotates to a different digit
            ans += (all(d not in '347' for d in S)
                    and any(d in '2569' for d in S))
        return ans

all()括号内的所有条件都满足,返回True,否则返回False
any()返回bool值,括号内只要有一个满足返回True,否则返回False
【DP】Python2
后期抽时间研究dp

class Solution(object):
    def rotatedDigits(self, N):
        A = map(int, str(N))
        memo = {}
        def dp(i, equality_flag, involution_flag):
            if i == len(A): return +(involution_flag)
            if (i, equality_flag, involution_flag) not in memo:
                ans = 0
                for d in xrange(A[i] + 1 if equality_flag else 10):
                    if d in {3, 4, 7}: continue
                    ans += dp(i+1, equality_flag and d == A[i],
                              involution_flag or d in {2, 5, 6, 9})
                memo[i, equality_flag, involution_flag] = ans
            return memo[i, equality_flag, involution_flag]

        return dp(0, True, False)

十、数位 DP 数位 DP 阅读详情

相关推荐

【信息科学与工程学】【安全领域】第三十五篇 网络安全算法表

编号算法名称算法的逐步骤思考推理的数学方程式和分解的数学方程式参数/变量列表复杂度(时间/空间)1​AES (高级加密标准)​1. 密钥扩展:从初始密钥生成轮密钥。 2. 初始轮: 3. 主轮循环(Nr-1轮):  - SubBytes:(非线性字节替换)  - ShiftRows:对状态矩阵的行进行循环移位。  - MixColumns:(在GF(2⁸)上的矩阵乘法)  - AddRoundKey: 4. 最终轮:执行SubBytes、ShiftRows、AddR

weixin_49199313的博客 1381

788. 旋转数字[dp待研究]

题目来源 leetcode 题目描述 题目解析 所有的数组都是由0-9这几个数字组成的 0,1,8 旋转之后是自己 2、5、6、9是好数 3、4、7旋转之后不是数 关键点:判断一个数是不是好数 如果这个数中出现了3,4,7,那么就一定不是 如果数字全部是由0、1、8这几个数组成,那么他们旋转之后还是自己,因此不是 如果数字由0、1、8、2、5、6、9组成,那么是 如果数字由2、5、6、9组...

OceanStar的博客 191

从零搭建ROS1导航小车(一):松灵SCOUT Mini底盘通讯配置与ROS包编译避坑指南

本文详细介绍了从零开始搭建ROS1导航小车的初始步骤,重点讲解松灵SCOUT Mini底盘的通讯配置与ROS包编译避坑指南。内容包括硬件连接、CAN通讯配置、ROS工作空间构建及编译优化等实用技巧,帮助开发者快速实现自主导航小车的通讯功能。

weixin_27014595的博客 189

leetcode 87 字符串多次翻转 分治+区间dp

解法一(错误):分治 开始的想法很朴素,先找到切分位置,然后切分后处理,其中,用素数存状态来判断是否一个分割位置合理。这种做法有个问题就是,一旦有一次切分错了,可能就回不来了,这个很致命。所以应该考虑每种切分情况,但这样是一定会超时的 ...

qq_39678022的博客 372

C# 操作Excel的时候,出现"被呼叫方拒绝接受呼叫的异常"的解决方案(参考官方给出的解决方案)

首先官方有对这个错误给出解释和解决方案,连接如下: https://docs.microsoft.com/zh-cn/previous-versions/ms228772(v=vs.120)#%E5%8F%AF%E9%9D%A0%E7%BC%96%E7%A8%8B 简单来说,貌似是线程问题,我猜。。。 之前我尝试着在代码中添加 Thread.Sleep(1000); 来进行解决,这种办...

Ck_Max的博客 5771

FFmpeg + OBS 低延迟直播串流实战:从H264裸流到RTP组播的完整配置

本文详细介绍了如何利用FFmpeg将H264裸流转码为RTP协议,并通过组播技术实现与OBS客户端的超低延迟直播串流。文章深入剖析了FFmpeg关键参数调优、SDP文件生成与配置,以及OBS客户端的无缝拉流方法,为需要毫秒级实时交互的场景提供了一套去中心化、高效稳定的完整解决方案。

fanta的博客 830

剑指offer92:翻转字符

题目: 如果一个由 ‘0’ 和 ‘1’ 组成的字符串,是以一些 ‘0’(可能没有 ‘0’)后面跟着一些 ‘1’(也可能没有 ‘1’)的形式组成的,那么该字符串是 单调递增 的。 我们给出一个由字符 ‘0’ 和 ‘1’ 组成的字符串 s,我们可以将任何 ‘0’ 翻转为 ‘1’ 或者将 ‘1’ 翻转为 ‘0’。 返回使 s 单调递增 的最小翻转次数。 示例一: 输入:s = “00110” 输出:1 解释:我们翻转最后一位得到 00111. 示例二: 输入:s = “010110” 输出:2 解释:我们翻转得到

L的博客 373

LC滤波器设计实战:从理论计算到PCB布局的完整指南

滤波器是信号处理与电路设计中的基础组件,用于从复杂信号中提取特定频率分量或抑制干扰噪声。其核心原理基于电感(L)和电容(C)等无源元件的频率选择特性,通过特定的网络拓扑实现幅频与相频特性的塑造。在工程实践中,LC滤波器因其结构简单、可靠性高、成本可控,成为射频、模拟及电源电路中的关键技术手段。其设计价值在于将理论网络综合转化为可量产、高性能的硬件解决方案,广泛应用于通信系统、音频处理、电源净化和传感器信号调理等场景。本文聚焦于LC滤波器的工程设计全流程,深入剖析了巴特沃斯、切比雪夫等经典类型的选型权衡,并重

weixin_34194829的博客 273

【LeetCode】788.旋转数字(python版)

题目描述: 我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。 如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己;2 和 5 可以互相旋转成对方;6 和 9 同理,除了这些以外其他的数字旋转以后都不再是有效的数字。 现在我们有一个正整数 N, 计...

SevenEleven的博客 422

大华事件检测智能服务器,大华股份:高速公路智能事件检测 解决方案

1方案背景随着我国基础设施建设的飞速发展,公路尤其是高速公路的总里程数年年攀升。交通运输部统计数据显示,截止2017年底全国公路总里程477.35万公里,其中高速公路13.65万公里,位居世界第一。高速公路的运营和管理作为全国交通管理的重要组成部分日益受到严峻挑战,交通拥堵和事故频发已成为高速公路上非常突出的问题。抛洒物、行人、车辆不规则行驶等事件是导致以上结果的重要原因。基于视频分析的高速公路智...

weixin_39523887的博客 1824

HUMAnN数据库国内备份下载源(转自刘永鑫博士github)

百度云链接 R语言常用包合集 Windows 10版4.0.x:链接:https://pan.baidu.com/s/1JFwLP2SonK1howD5MNgNYg 提取码:l08k Windows 10版3.6.x:链接:https://pan.baidu.com/s/1h-qR2lmlaMgR4M7VbgtAFg 提取码:s5fi 下载后解压至当前目录,可获得3.6/4.0目录,剪切并替换文档 - R - win-library - 3.6/4.0 目录即可 扩增子数据库 宏基因组数据库 HUM.

zlabx的博客 3250

LeetCode算法题解 788-旋转数字

题目描述 题解: 看代码的注释。 代码: class Solution { public: int rotatedDigits(int N) { int cnt = 0; for(int i = 1; i <= N; i++) { if(rotateIsOk(i))// 判断: 1.每个数位旋转180°后,是...

东瓜blog 264

AIGC算法工程师-面试八股文-2025年版本-算法八股文/工程八股文/开放式问题

​两年前整理了《AIGC算法工程师 面试八股文》,全网一共有100w读者看过,收到了很多小伙伴的催更。Diffusion的技术发展非常快,博主特意整理了最近两年最新的八股文,内容非常全面,涵盖算法八股文/工程八股文/开放式问题三个大类,希望能为求职的读者们带来帮助。

沉迷单车的追风少年 4188

LeetCode 788. 旋转数字

【数位DP】用f(pos, diff, limit)来表示第pos位,是否包含一个2,5,6,9并且不包含(3,4,7),limit表示是否受到边界限制,如果受到边界限制,那么只能填0-s[pos]范围,并且填了s[pos]后下面还是继续受限制,否则可以填0-9。【模拟】直接验证至少包含(2,5,6,9)中的一个,可以包含(0,1,8)其他不能包含。O(nlogn)的复杂度,因为要把所有数都枚举一遍,还要枚举每个数的每一位。

Sasakihaise_的博客 2850

医疗影像分析实战:肺炎X光片分类与分割

医疗影像分析实战:肺炎X光片分类与分割 ,人工智能,计算机视觉,大模型,AI,在医疗领域,医疗影像分析技术凭借其高效、精准的特点,成为疾病诊断与治疗的重要辅助手段。肺炎作为一种常见的呼吸道疾病,严重威胁人类健康,通过 X 光片对肺炎进行诊断是临床常用方法。利用计算机技术实现肺炎 X 光片的自动分类与分割,不仅能减轻医生的工作负担,还能提高诊断的准确性和效率。本文将深入讲解肺炎 X 光片分类与分割的实战过程,结合大量代码示例和关键概念解析,帮助读者掌握相关技术。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 3万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

面试必看:788. 旋转数字

题目要求统计1到N中满足「好数」条件的数字数量。好数的定义是:数字旋转180度后仍是有效数字且与原数字不同。解题关键在于逐数遍历和逐位校验,排除包含3、4、7的数字,并确保至少包含2、5、6、9中的一个。通过拆分数字的每一位进行判断,时间复杂度为O(n*d),空间复杂度为O(1)。代码简洁高效,适用于常规输入范围。

2501_90114783的博客 416

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LeetCode-788. 旋转数字【暴力,动态规划,字符串,数学】

我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己;2 和 5 可以互相旋转成对方(在这种情况下,它们以不同的方向旋转,换句话说,2 和 5 互为镜像);6 和 9 同理,除了这些以外其他的数字旋转以后都不再是有效的数字。现在我们有一个正整数 N, 计算从 1 到 N 中有多少个数 X 是好数?

zik的博客 222

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【不太常规的数位 DP】

LeetCode 788. 旋转数字 数位 DP 解法

m0_57883655的博客 256

【DP】数字旋转 校OJ2445

#include &lt;bits/stdc++.h&gt; using namespace std; int n, m; char ch[105][15]; int len[105]; int a[15], b[15]; long long dp[105][1010]; int jiaohuan(int t, int k) //ch[t]换k次 { for (int i = 0; i &l...

博客 251

leetcode788

做完看了一下别人的题解发现可以用数位dp做。思路就是将数字转化为字符串,然后声明一个dp数组来记忆化搜索过的状态。思路:只有题目中出现2 5 6 9才可能是好数,如果出现了3 4 7,那么直接返回false。数据范围是[1, 10000],所以暴力枚举可以过。设置一个dif数组对10个数字进行分类。

Reman0的博客 261

【LeetCode】788. Rotated Digits

X is a good number if after rotating each digit individually by 180 degrees, we get a valid number that is different from X.  Each digit must be rotated - we cannot choose to leave it alone. A number...

iKun 289

LeetCode 每日一题 2026/4/27-2026/5/3

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步

AlphaTao的博客 741

leetcode 788. Rotated Digits

X is a good number if after rotating each digit individually by 180 degrees, we get a valid number that is different from X.  Each digit must be rotated - we cannot choose to leave it alone. A number ...

weixin_34397291的博客 115

LeetCode刷题记录--模拟

模拟,方向,搜索,

m0_67739923的博客 1688

算法学习(十四)深度优先

1> 数位DP,求小于N的符合条件的数的个数,注意以下几点:用一个 target数组 存储N的每一位用一个 preLimit 变量表示前面的是否处于临界状态,当且仅当preLimit为true且当前位到达target对应位时,nextLimit为true用一个 pos 表示当前处理到数字的第多少位,pos到len(target)时结束递归题目说明实现788. 旋转数字dp时用preValid表示前面是否已经含有2569我的提交2376. 统计特殊整数。

qq_42767993的博客 1160

回溯-题目总结

回溯是一种算法思想,能够回到过去,恢复现场。

31楼下小黑的博客 577
上一篇: 【字符串-简单】824. 山羊拉丁文
下一篇: 【字符串】1507. 转变日期格式
菜菜2022
博客等级 码龄9年 67粉丝 1033原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值