小红书
魔法水晶
"""
题目描述:
魔法世界里有一位魔法师, 他要踏着河中间的几块石头走到对岸.有的石头上放了一块白水晶, 有的石头上放了一块黑水晶, 还有的石头上什么也没有放.魔法师需要将空的石头上放上一块黑水晶或者白水晶,使得黑水晶和白水晶的个数是一样, 这样才能过河.
但空的石头上放上黑水晶或者白水晶需要消耗魔法师的能量, 并且不同的石头上面放白水晶和黑水晶所需要的能量是不一样的.
输入会给出所有石头上的水晶颜色,如果是空的话,会分别给出魔法师放黑水晶和白水晶所需要的能量.
你的程序需要输出魔法师过河所需要的最少能量, 如果无法过河, 则输出-1.
输入与输出:
第一行表示石头的个数. (0 < N < 5000000)
从第二行开始有N行, 每一行的第一个数字代表水晶颜色, 1=白, 2=黑, 0=空, 如果是空的话, 这一行的第2和第3个数字分别表示放置白水晶和黑水晶所需要的能量
输出需要的最小能量值. 如果不能过河, 则输出-1.
测试用例:
10
1
1
0 1 2
2
2
2
1
0 2 4
0 2 8
1
8
"""
发放零食(回溯法)
"""
题目描述:
小红书每周四会给同学们发放零食水果,假设我们的工位是一个N*N的形状,并且有一些工位上是空的。阿姨会从左上角的工位开始发零食,每次向一个相邻(上下左右四个方向)的工位移动。为了零食能尽快发完,阿姨希望只经过有同学在的工位并且每个工位只经过一次,最后一个收到零食的同学也需要是在最后一排,请问阿姨总共有多少种移动的方案?
输入与输出:
第一行一个整数N (0<N<=7),接下来是N*N个字符,“.”代表这个工位有人,“#”代表这个工位是空的。
一个整数,代表总共的方案数
测试用例:
3
..#
..#
...
1
解释:
从左上角(1,1)位置开始,依次经过(1,2), (2,2), (2,1), (3,1), (3,2), (3,3)
"""
matrix = [
[ '.' , '.' , '#' ] ,
[ '.' , '.' , '#' ] ,
[ '.' , '.' , '.' ] ,
]
n = 0
visited = [ ]
for temp in matrix:
visited. append( [ - 1 ] * len ( matrix) )
for j in temp:
if j == '.' :
n += 1
visited[ 0 ] [ 0 ] = 1
def check ( ) :
count = 0
for i in range ( len ( visited) ) :
for j in range ( len ( visited) ) :
if visited[ i] [ j] == 1 :
count += 1
if count == n:
return True
else :
return False
res = 0
def dfs ( row, j) :
if row == len ( matrix) - 1 and check( ) :
global res
res+= 1
print ( res)
return
if row- 1 >= 0 :
if matrix[ row- 1 ] [ j] != '#' and visited[ row- 1 ] [ j] != 1 :
visited[ row- 1 ] [ j] = 1
dfs( row- 1 , j)
visited[ row - 1 ] [ j] = - 1
if row+ 1 < len ( matrix) :
if matrix[ row+ 1 ] [ j] != '#' and visited[ row+ 1 ] [ j] != 1 :
visited[ row+ 1 ] [ j] = 1
dfs( row+ 1 , j)
visited[ row + 1 ] [ j] = - 1
if j- 1 >= 0 :
if matrix[ row] [ j- 1 ] != '#' and visited[ row] [ j- 1 ] != 1 :
visited[ row] [ j- 1 ] = 1
dfs( row, j- 1 )
visited[ row] [ j- 1 ] = - 1
if j+ 1 < len ( matrix) :
if matrix[ row] [ j+ 1 ] != '#' and visited[ row] [ j+ 1 ] != 1 :
visited[ row] [ j+ 1 ] = 1
dfs( row, j+ 1 )
visited[ row] [ j+ 1 ] = - 1
dfs( 0 , 0 )
知识点:N皇后问题
cnt = 0
n = 10
a = [ - 1 ] * n
def check ( x, y) :
for i in range ( x) :
if a[ i] == y:
return False
if i+ a[ i] == x+ y:
return False
if i- a[ i] == x- y:
return False
return True
def dfs ( row) :
if row == n:
global cnt
cnt += 1
return
for i in range ( n) :
if check( row, i) :
a[ row] = i
dfs( row+ 1 )
a[ row] = - 1
dfs( 0 )
print ( cnt)
python避坑
visited = [ [ 0 ] * 3 ] * 3
visited[ 0 ] [ 0 ] = 1
visited= [ [ 0 for i in range ( 3 ) ] for i in range ( 3 ) ]
看电影
"""
题目描述:
周末到了,薯队长跟伙伴们约好去电影院放松一下,他们准备看三场电影。 请你根据电影院的场次安排,帮薯队长预定三场电影,使得观看总时间最长。这三场电影时间不得重叠。
输入描述
第一行一个整数N,表示可以预定的总场次数 (0<N<=2000)
接下来N行,分别表示场次的开始和结束时间,时间格式为 "hh:mm-hh:mm"(开始时间早于结束时间,范围在[00:00,23:59])。如果一场电影的结束时间和另一场电影的开始时间相同,薯队长可以同时预定这两场。
输出描述
一个整数,表示最大的总时间(分钟计),如果无法预定三场,则输出0
样例输入
4
10:00-10:30
10:30-11:00
11:00-11:30
10:00-10:29
"""
字节跳动(算法)
完美数字
"""
题目描述:一个整数由相同的数字构成,成为完美数字比如:1,2,11,22,333,求一个区间[x,y]中有多少个完美数字 1<=x<=y<=10^9
"""
res = 0
for i in range ( x, y+ 1 ) :
s = list ( str ( i) )
if len ( set ( s) ) == 1 :
res += 1
print ( res)
分糖果
"""
题目描述:
小明和N个小朋友,N个小朋友站成一排,小明站最右边
n个小朋友初始糖果数量a[1]、a[2]……a[n],每次分配糖果先给第一个小朋友
若小朋友的糖(加上分配的一颗)小于等于右边小朋友糖的数量,小朋友拥有这个糖
否则,传递给右边的小朋友
最后一个小朋友不喜欢糖,直接传给小明,(最后一个小朋友的糖的数量一直为a[n])
找到第m颗糖给了哪个小朋友
"""
while m:
res = 0
for i in range ( 1 , n) :
temp = 1
if a[ i] >= a[ i- 1 ] + 1 :
a[ i- 1 ] += 1
res = i- 1
temp = 0
m -= 1
break
if temp:
m-= 1
res = n
print ( res+ 1 )