算法笔试题

一,搜索连通域 

M, N = list(map(int, input().split(',')))
print(M,N)
book = []
for i in range(M):
    line = list(map(int, input().split(',')))
    book.append(line)
print(book)
# M=N=3
# book=[[1, 0, 0], [0, 1, 0], [0, 1, 1]]
print('book=',book)
class Solution:
    def __init__(self,pos):
        self.pos=pos#给定的矩阵
        print('self.pos',self.pos)
        print(self.pos[0][0])
        self.dp=[]#保存所有区域的人数
        self.cnt=0#记录当前区域的人数
    #搜索联通区域
    def dfs(self,i,j):
        if 0<=i<M and 0<=j<N:
            if self.pos[i][j]==1:#确保递归遍历的时候有人才加人
                self.cnt+=1
                self.pos[i][j] =0#遍历过置0,避免重复搜索
                self.dfs(i, j-1)
                self.dfs(i, j+1)
                self.dfs(i-1, j)
                self.dfs(i+1, j)
                self.dfs(i - 1, j-1)
                self.dfs(i - 1, j +1)
                self.dfs(i +1, j - 1)
                self.dfs(i +1, j +1)

    def solver(self):
        for i in range(M):
            for j in range(N):
                if self.pos[i][j]==1:
                    self.cnt=0#清零人数重新计数
                    self.dfs(i,j)
                    if self.cnt>0:
                        self.dp.append(self.cnt)
        return self.dp
s=Solution(book)
dp=s.solver()
print('球队个数={},球队的最大群体人数={}'.format(len(dp),max(dp)))

二,简单二叉树的实现

#简单二叉树的实现
class Node:
    def __init__(self,number):
        self.number=number
        self.lchild=None
        self.rchild=None
class Tree:
    lis=[]
    def __init__(self):
        self.root=None
    #增加节点
    def add(self,number):
        node=Node(number)
        if self.root==None:
            self.root=node
            print('add root')
            Tree.lis.append(self.root)
            print('Tree.lis=', Tree.lis)
        else:
            while True:
                point=Tree.lis[0]
                print('point=',point)
                if point.lchild==None:
                    point.lchild=node
                    Tree.lis.append(point.lchild)
                    print('add lchild')
                    print('Tree.lis=', Tree.lis)
                    return
                if point.rchild==None:
                    point.rchild=node
                    Tree.lis.append(point.rchild)
                    print('add rchild')
                    print('Tree.lis=', Tree.lis)
                    Tree.lis.pop(0)#更换root节点
                    print('Tree.lis=', Tree.lis)
                    return
if __name__ == '__main__':
    t=Tree()
    L=[1,2,3,4,5,6,7]
    for x in L:
        t.add(x)
        # print('success')

三,找列表里的最长字符串

#找列表里的最长字符串
res=['a','v','f','sd','456','dfgg']
num_list=[len(i) for i in res]
max_length_str=res[num_list.index(max(num_list))]
print(max_length_str)

#找列表里的最长字符串
a=sorted(res,key=lambda x:len(x),reverse=True)
print(a[0])

四,找两个字符串的最长公共字符串(暴力解法)

def function(s1):
    #找所有子字符串的结果
    a=[]
    for i in range(0,len(s1)):
        for j in range(i+1,len(s1)+1):
            a.append(s1[i:j])
    return a

s1='sadsadarefcsfdsfds'
s2='sadsafcvwertdfgdfg'
res1=function(s1)
res2=function(s2)

res=[]
for i in res1:
    if i in res2:
        #找共同字符串
        res.append(i)
#找出共同字符串中的最长字符串
res=sorted(res,key=lambda x:len(x),reverse=True)
print(res[0])

五,如题

A=list(map(int,input().split(',')))
print(A)

# A=[1,3,4,4]
for i in range(len(A)-1):
    if sum(A[:i])==A[i] and A[i]==sum(A[i+1:]):
        print(A[i])
    else:
        print(False)

六,如题

a1,a2=input().split('-')
print('a1,a2=',a1,a2)
a1=list(map(int,a1.split(',')))
a2,k=a2.split(':')

a2=list(map(int,a2.split(',')))
k=int(k)
print('a1,a2,k=',a1,a2,k)

tem=[]
for i in a1:
    tem+=[i+j for j in a2]
print('tem=',tem)
print(list(map(str,sorted(tem,reverse=True)))[:k])
print(','.join(list(map(str,sorted(tem,reverse=True)))[:k]))

七,如题

X,Y,Z=sorted(list(map(int,input().split(' '))))
print(X,Y,Z)
def solve(X,Y,Z):
    cnt = 0
    for a in range(1,X+1):
        for b in range(1,Y+1):
            #最短边
            min_c=abs(a-b)+1
            # print(min_c)
            # 最长边
            max_c=min(a+b-1,Z)
            # print(max_c)
            cnt+=max_c-min_c+1
            cnt%=1000000007
    return cnt
cnt=solve(X,Y,Z)
print('cnt=',cnt)

 

八,如题,采用贪心算法

N=int(input())
line=[]
for i in range(N):
    a,b=sorted(list(map(int,input().split(' '))))
    line.append([a,b])
print(line)

# line=[[3, 6], [1, 3], [2, 5]]
line=sorted(line,key=lambda x:x[1])
print('line=',line)

ret = [line[0]]
print('ret=',ret)
for item in line[1:]:
    print('item=',item)
    if ret[-1][1]>item[0]:
        pass
    else:
        ret.append(item)
print(ret)
print(len(ret))

九,如题,

N,M,P=list(map(int,input().split(' ')))
print('N={},M={},p={}'.format(N,M,P))
A=list(map(int,input().split(' ')))
print(A)

# N,M,P=3,4,2
# A=[5,3,1]
for i in range(M):
    flag,t=input().split(' ')
    t=int(t)
    if flag=='A':
        A[t-1]+=1
    else:
        A[t - 1] -= 1
    print('A=',A)
# A=[4,5,2]
A=list(zip(A,range(1,len(A)+1)))
print('A=',A)
#按照份数进行排序
A=sorted(A,reverse=True)
print('A=',A)
#排名第一的第二种食物,value=1
ret={A[0][1]:1}
print('ret=',ret)
for i in range(1,len(A)):
    if A[i][0]==A[i-1][0]:
        ret[A[i][1]]=ret[A[i][0]]
    else:#key->value
        ret[A[i][1]] =i+1
print(ret)
print(ret[P])

十.教学任务指派问题,匈牙利算法,由谁去做某某件事情总体的时间或者效率最高

#教学任务指派问题
#匈牙利算法,由谁去做某某件事情最合适

import numpy as np
from scipy.optimize import linear_sum_assignment

def printf(row_ind,col_ind):#输出
    print("最优教师课程指派:")
    for i in range(len(row_ind)):
        print("教师",row_ind[i], "->课程", col_ind[i],end='; ')
    print()
#教师与课程一样多
#各个教师对各个课的擅长程度矩阵
goodAt =np.array([[18, 5, 7, 16],
                  [10, 16, 6, 5],
                  [11, 6, 4, 7],
                  [13, 12, 9, 11]])
print('==每个老师对课程的擅长矩阵:\n', goodAt)
#由最大值减去矩阵,变成求解最小值问题
weakAt = 20 - goodAt
row_ind, col_ind = linear_sum_assignment(weakAt)
print('==row_ind:', row_ind)#开销矩阵对应的行索引
print('==col_ind:', col_ind)#对应行索引的最优指派的列索引
print('==goodAt[row_ind, col_ind]:', goodAt[row_ind, col_ind])#提取每个行索引的最优指派列索引所在的元素,形成数组
print('最优结果为', goodAt[row_ind, col_ind].sum())#数组求和
printf(row_ind, col_ind)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值