降龙十八掌掌掌吐血

小红书

魔法水晶

"""
题目描述:
魔法世界里有一位魔法师, 他要踏着河中间的几块石头走到对岸.有的石头上放了一块白水晶, 有的石头上放了一块黑水晶, 还有的石头上什么也没有放.魔法师需要将空的石头上放上一块黑水晶或者白水晶,使得黑水晶和白水晶的个数是一样, 这样才能过河.
但空的石头上放上黑水晶或者白水晶需要消耗魔法师的能量, 并且不同的石头上面放白水晶和黑水晶所需要的能量是不一样的.
输入会给出所有石头上的水晶颜色,如果是空的话,会分别给出魔法师放黑水晶和白水晶所需要的能量.
你的程序需要输出魔法师过河所需要的最少能量, 如果无法过河, 则输出-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)
"""

# 边界条件:全部访问 and 当前位置为最后一行
# 判断条件:四个方向移动,(有效路径、未访问过、不是空座位)

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
    # for i in range(len(matrix)):
    #     for j in range(len(matrix)):
    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皇后问题

# -*- coding: utf-8 -*- 
# @Time : 2021/8/21 下午 10:39 
# @Author : Renlele 
# @File : NQueen.py 
# @Software: Pycharm
# 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,0],[0,0,0],[0,0,0]]  相当于创建了3个引用
visited[0][0] = 1   #visited = [[1,0,0],[1,0,0],[1,0,0]]
# 正确的方法:
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
"""
# 思路1: 将数字转化为数组,在转化为集合,集合的长度为1,就是完美数字, BUTBUTBUT超时了,测试用例没有通过30%。。。。。。
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颗糖给了哪个小朋友
"""
# 思路1:从左到右遍历   BUTBUTBUT :用例通过率只有23.8%
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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值