华为2020春季补招上机题

参加了华为的补招,一共三道题,满分600分,AC两道,400分就溜了
T1.顺时针旋转矩阵
输入n,表示正方形矩阵大小,再输入矩阵,最后输入m
m表示顺时针旋转90°的次数
输出旋转后得到的矩阵
eg:
输入:
3
1 2 3
4 5 6
7 8 9
2
输出:
9 8 7
6 5 4
3 2 1
解释:
第一次顺时针旋转90°得到
7 4 1
8 5 2
9 6 3
第二次得到
9 8 7
6 5 4
3 2 1
把矩阵转置的代码稍微修改一下

#矩阵转置代码
[ [row[i] for row in A] for i in range(len(A)) ]
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# datetime:2020-03-04 18:58
# software: PyCharm
import sys
if __name__ == "__main__":
    # 读取第一行的n
    n = int(sys.stdin.readline().strip())
    ans = 0
    A=[]
    for i in range(n):
        # 读取每一行
        line = sys.stdin.readline().strip()
        # 把每一行的数字分隔后转化成int列表
        values = list(map(int, line.split()))
        A.append((values))
    m = int(sys.stdin.readline().strip())
    m = m%4
    def transpose(A):
        B= [[x[i] for x in A] for i in range(len(A[0]))]
        C=[]
        #每一行进行取逆
        for line in B:
            C.append(line[::-1])
        return C
    #print(n,m)
    for _ in range(m):
        A=transpose(A)
    #输出
    for i in range(n):
        for j in range(n):
            if j==n-1:
                print(A[i][j])
            else:
                print(A[i][j], end = " ")

T2.n个小朋友,k个苹果,输出分配苹果的不同方法,和具体怎么分配
eg:
n=2 k=3
输出:
4
xxx|
xx|x
x|xx
|xxx

不会写。。
T3.编辑距离改编题
输入n,接下来2n行,前n行表示待修改文章,后n行表示已修改文章
输出从待修改文章到已修改文章最少编辑的次数
一次编辑:删除 添加 替换都算一次编辑
eg:
输入:
2
abcdef
2334
bcdg
123
输出:
解释:abcdef–> 删除a --> bcdef -->删除e -->bcdf -->f替换成g ,编辑3次
234–>插入1 -->1234–>删除4–> 123,编辑2次
最终输出5次
解法:动态规划

#!/usr/bin/env python
#-*- coding:utf-8 -*-
# datetime:2020-03-04 19:41
# software: PyCharm
import sys
if __name__ == "__main__":
    def minDistance(word1:str,word2:str):
        n1=len(word1)
        n2=len(word2)
        dp=[[0]*(n2+1) for _ in range(n1+1)]

        for j in range(1,n2+1):
            dp[0][j]=dp[0][j-1]+1
        for i in range(1,n1+1):
            dp[i][0]=dp[i-1][0]+1
        for i in range(1,n1+1):
            for j in range(1,n2+1):
                if word1[i-1]==word2[j-1]:
                    dp[i][j]=dp[i-1][j-1]
                else:
                    dp[i][j]=min(dp[i][j-1],dp[i-1][j],dp[i-1][j-1])+1
        return dp[-1][-1]

    n = int(sys.stdin.readline().strip())
    A=[]
    B=[]
    for _ in range(n):
        a=sys.stdin.readline().strip()
        A.append(a)
    for _ in range(n):
        b = sys.stdin.readline().strip()
        B.append(b)
    res=0
    for i in range(n):
        k=minDistance(str(A[i]),str(B[i]))
        res+=k
    print(res)

你可能感兴趣的:(数据结构和算法,leetcode)