解决leetcode第3906题统计网格路径中好整数的数目

3906.统计网格路径中好整数的数目

难度:困难

问题描述:

给你两个整数l和r,以及一个由恰好三个'D'字符和三个'R'字符组成的字符串directions。

对于范围[l,r](包含边界)内的每个整数x,执行以下步骤:

如果x的位数少于16位,请在其左侧填充前导零,使其成为16位的字符串。

将这16个数字以行优先的顺序放入一个4×4的网格中(前4个数字从左到右构成第一行,接下来的4个数字构成第二行,依此类推)。

从左上角单元格(row=0,column=0)开始,按顺序应用directions中的6个字符:

'D'使行数加1。

'R'使列数加1。

记录沿路径访问的数字序列(包括起始单元格),生成一个长度为7的序列。

如果记录的序列是非递减的,则认为整数x是一个好整数。

返回一个整数,表示在范围[l,r]内好整数的数量。

示例1:

输入:l=8,r=10,directions="DDDRRR"

输出:2

解释:

x=8的网格:

0 0 0 0

0 0 0 0

0 0 0 0

0 0 0 8

路径:(0,0)→(1,0)→(2,0)→(3,0)→(3,1)→(3,2)→(3,3)

访问的数字序列为[0,0,0,0,0,0,8]。

由于访问的数字序列是非递减的,因此8是一个好整数。

x=9的网格:

0 0 0 0

0 0 0 0

0 0 0 0

0 0 0 9

访问的数字序列为[0,0,0,0,0,0,9]。

由于访问的数字序列是非递减的,因此9是一个好整数。

x=10的网格:

0 0 0 0

0 0 0 0

0 0 0 0

0 0 1 0

访问的数字序列为[0,0,0,0,0,1,0]。

由于访问的数字序列不是非递减的,因此10不是一个好整数。

因此,只有8和9是好整数,在该范围内总共有2个好整数。

示例2:

输入:l=123456789,r=123456790,directions="DDRRDR"

输出:1

解释:

x=123456789的网格:

0 0 0 0

0 0 0 1

2 3 4 5

6 7 8 9

路径:(0,0)→(1,0)→(2,0)→(2,1)→(2,2)→(3,2)→(3,3)

访问的数字序列为[0,0,2,3,4,8,9]。

由于访问的数字序列是非递减的,因此123456789是一个好整数。

x=123456790的网格:

0 0 0 0

0 0 0 1

2 3 4 5

6 7 9 0

访问的数字序列为[0,0,2,3,4,9,0]。

由于访问的数字序列不是非递减的,因此123456790不是一个好整数。

因此,只有123456789是好整数,在该范围内总共有1个好整数。

示例3:

输入:l=1288561398769758,r=1288561398769758,directions="RRRDDD"

输出:0

解释:

x=1288561398769758的网格:

1 2 8 8

5 6 1 3

9 8 7 6

9 7 5 8

路径:(0,0)→(0,1)→(0,2)→(0,3)→(1,3)→(2,3)→(3,3)

访问的数字序列为[1,2,8,8,3,6,8]。

由于访问的数字序列不是非递减的,因此1288561398769758不是一个好整数。

没有好整数,在该范围内总共有0个好整数。

提示:

1<=l<=r<=9×10**15

directions.length==6

directions由恰好三个'D'字符和三个'R'字符组成。

问题分析:

解决本问题需要解决以下几个子问题:1是如何将一个整数变成一个16位的数字字符串,进而生成一个二维网格数组,这通过函数change_int_to_str_array(n)实现;2是如何根据directions中的操作符对生成的二维网格进行操作,得到一个包含7个元素的操作序列,这通过函数create_access_character_sequences(grid,directions)实现;3是根据上面的两步,判断一个整数是否为一个好整数,这通过函数check_if_a_good_int(n,d)实现;4主程序则对区间[l,r]之间的所有整数进行判断,计录其中的好整数个数,并输出计数结果。

程序如下:

python 复制代码
#将一个整数转换成一个16位的字符串,并形成一个4*4的二维数组返回
def change_int_to_str_array(n):
    n=str(n)
    l=len(n)
    n=(16-l)*'0'+n
    a=[n[:4],n[4:8],n[8:12],n[12:16]]
    return a

#利用directions字符串在给定的网格grid中访问生成访问字符序列并返回
def create_access_character_sequences(grid,directions):
    x,y=0,0 #x代表列数,y代表行数
    a=[grid[y][x]]
    for i in directions:
        if i=='D':
            y+=1
            a.append(grid[y][x])
        else:
            x+=1
            a.append(grid[y][x])
    return a

#判断一个整数是否为好整数,如果是,返回True,否则返回False
def check_if_a_good_int(n,d):
    grid=change_int_to_str_array(n)
    a=create_access_character_sequences(grid,d)
    b=sorted(a)
    if a==b:
        return True
    else:
        return False

#主程序
l=int(input('pls input l='))
r=int(input('pls input r='))
directions=input('pls input directions=')
c=0
for i in range(l,r+1):
    if check_if_a_good_int(i,directions):
        c+=1
print(f'共有好整数{c}个')

运行实例一

pls input l=123

pls input r=125

pls input directions=DDDRRR

共有好整数3个

运行实例二

pls input l=1223334444

pls input r=1223334446

pls input directions=DDRDRR

共有好整数3个

相关推荐
KobeSacre1 小时前
leetcode 树
算法·leetcode·职场和发展
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 104. 二叉树的最大深度 | C++ 自底向上递归最优解
算法
Robot_Nav2 小时前
Kinodynamic Lazy ThetaStar:面向实时机器人导航的两阶段运动学路径规划算法
算法·机器人·lazy theta
财经资讯数据_灵砚智能2 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年4月23日
大数据·人工智能·python·信息可视化·自然语言处理
yuanmazhiwu2 小时前
计算机毕业设计:Python股市行情可视化与ARIMA预测系统 Flask框架 ARIMA 数据分析 可视化 大数据 大模型(建议收藏)✅
大数据·python·数据分析·django·flask·课程设计
AC赳赳老秦2 小时前
OpenClaw与Excel联动:批量读取/写入数据,生成可视化报表
开发语言·python·excel·产品经理·策略模式·deepseek·openclaw
覆东流2 小时前
第5天:Python字符串操作进阶
开发语言·后端·python
NotFound4862 小时前
分享实战中Python Web 框架对比:Django vs Flask vs FastAPI
前端·python·django