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

相关推荐
南 阳17 分钟前
Python从入门到精通day66
开发语言·python
m0_5967490937 分钟前
JavaScript中手动实现一个new操作符的底层逻辑
jvm·数据库·python
刀法如飞39 分钟前
Go 字符串查找的 20 种实现方式,用不同思路解决问题
算法·面试·程序员
DTAS尺寸公差分析软件44 分钟前
DTAS3D v13.0 三维尺寸公差分析软件可申请试用
python·尺寸公差分析·三维公差分析·公差仿真软件·尺寸链计算
DTAS尺寸公差分析软件1 小时前
DTAS 3D公差分析软件最新版本介绍
python·3d·尺寸公差分析·尺寸链计算·尺寸工程·尺寸链校核软件·公差仿真分析
PieroPc1 小时前
CAMWATCH — 局域网摄像头监控系统 Fastapi + html
前端·python·html·fastapi·监控
feasibility.1 小时前
反爬十层妖塔:现代爬虫攻防的立体战争
爬虫·python·科技·scrapy·rust·go·硬件
十八旬1 小时前
快速安装ClaudeCode完整指南
开发语言·windows·python·claude
dFObBIMmai2 小时前
如何在 CSS 中实现元素的绝对定位,使其不受窗口尺寸变化影响
jvm·数据库·python
Dlrb12112 小时前
C语言-指针数组与数组指针
c语言·数据结构·算法·指针·数组指针·指针数组·二级指针