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个