解决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个

相关推荐
To_OC7 小时前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC7 小时前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK9 小时前
线段树维护区间 k 次方和
c++·数学·算法·stl
Warson_L14 小时前
Python `Annotated` 与 LangGraph Reducer 学习笔记
python
韩师傅14 小时前
海天线算法的前世今生
python·计算机视觉
韩师傅14 小时前
当你的甲方设备过烂,要如何快速出效果?
python·计算机视觉
Warson_L14 小时前
LangGraph的MessageState and HumanMessage
python
韩师傅15 小时前
当你的甲方吐槽天空不够蓝,你应该如何应对
python·计算机视觉
Warson_L15 小时前
python的类&继承
python
Warson_L15 小时前
类型标注/type annotation
python