Python每日一练——第44天:大厂真题练习

发布于:2022-11-04 ⋅ 阅读:(683) ⋅ 点赞:(0)

推荐《牛客网 | 大厂真题 | 笔试题库 | 面试经验 | 实习经验内推》

链接地址,废话少说速度上号刷题卷起来👉👉:点击链接进行免费刷题学习

在这里插入图片描述



1. 最大差值

描述
有一个长为 n 的数组 A ,求满足 0 ≤ a ≤ b < n 的 A[b] - A[a] 的最大值。
给定数组 A 及它的大小 n ,请返回最大差值。

**注意**:1.矩阵中从第一行 (视为节点 0 )开始,表示与其他每个点的连接情况,例如 [01011,10100,01000,10000,10000] 表示节点 0 与节点 1 , 3 , 4相连,节点 1 与节点 0 , 2相连,其他点的以此类推。2.并不保证是一棵二叉树,即一个节点有可能有多个后继节点,我们把节点 0 视为树的根节点。![在这里插入图片描述](https://img-blog.csdnimg.cn/bf4d46575b2d4ed99c334aedb671f858.png)

实现代码:

# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param A int整型一维数组 
# @param n int整型 
# @return int整型
#
class Solution:
    def getDis(self , A: List[int], n: int) -> int:
        # write code here
        maxVal=0      #设置差值,如果没有A[b]-A[a]>0的值,则返回最大值为0
        dp=A[0]       #获取0~b之间的最小值,默认最小值为A[0]
        for i in range(1,n,1):
            dp=min(A[i],dp)
            maxVal=max(A[i]-dp,maxVal)
        return maxVal

运行结果:
在这里插入图片描述



2. 交叉线

描述: 大M布置给小M一个题目:首先给出n个在横坐标上的点,然后连续的用半圆连接他们:首先连接第一个点与第二点(以第一个点和第二点作为半圆的直径)。然后连接第二个第三个点,直到第n个点。现在需要判定这些半圆是否相交了,在端点处相交不算半圆相交。如下图所示。
在这里插入图片描述

输入描述:输入的第一行包含一个整数T (1 ≤ T ≤ 10)表示有T组样例。每组样例的第一行是一个整数n (1≤n≤1000)。接下来的一行输入有n个用空格隔开的不同的整数a1,a2,…,an (-1000000 ≤ ai ≤ 1000000),(ai,0)表示第i个点在横坐标的位置

输出描述:对于每个输入文件,输出T行。每行输出"y"表示这些半圆有相交或者"n"。

实现代码:

while True:
    try:
        n = int(input())
        for case in range(n):
            m1 = int(input())
            list1 = list(map(int,input().split()))
            one = list()
            for i in range(len(list1)):
                if i <m1-1:
                    one.append((list1[i],list1[i+1]))
            count = 0
            flag = False
            #print(one)
            for i in one:
                k1,k2 = i[0],i[1]
                count+=1
                for j in range(count,len(one)):
                    ppp = one[j]
                    p1,p2 = ppp[0],ppp[1]
                     
                    if (min(k1,k2)<min(p1,p2) and max(k1,k2)>min(p1,p2) and max(k1,k2)<max(p1,p2))&nbs***bsp;(max(k1,k2)>max(p1,p2) and min(k1,k2)<max(p1,p2) and min(k1,k2)>min(p1,p2)):
                        flag =True
                        break
                else:
                    continue
                break
            if flag == True:
                print('y')
            else:
                print("n")
                         
         
    except:
        break


3. 火眼金睛

描述: 现在我们需要查出一些作弊的问答社区中的ID,作弊有两种:1.A回答了B的问题,同时B回答了A的问题。那么A和B都是作弊。2.作弊ID用户A和作弊ID用户B同时回答了C的问题,那么C也是作弊。已知每个用户的ID是一串数字,一个问题可能有多个人回答。

输入描述:每组数据第一行为总问题数N(N小于等于200000),第二行开始每行一个问题,第一个数字为提问人ID,第二个数字为回答人数,后面则为所有回答人的ID。(ID均为0-1000000的整数)

输出描述:第一行为作弊ID数量,第二行开始为从小到大的每行一个作弊ID。

实现代码:

while True:
    try:
        qnum=int(input())
        askId,ansNum=[0 for i in range(qnum)],[0 for i in range(qnum)]
        wenda=[[0 for i in range(qnum+1)] for j in range(qnum+1)]
        for i in range(qnum):
            tmp=list(map(int,input().split()))
            askId[i],ansNum[i]=tmp[0],tmp[1]
            temp=2
            for j in range(ansNum[i]):
                ansId = tmp[temp]
                temp+=1
                wenda[askId[i]][ansId]=1
        result=[]
        for i in range(qnum+1):
            count=0
            for j in range(qnum+1):
                if wenda[i][j]==1 and wenda[j][i]==1 and i!=j and i not in result:
                    count+=1
                    result.append(i)
                if wenda[i][j]==1 and i!=j and j in result:
                    count+=1
                if count>=2 and i not in result:
                    result.append(i)
        result=[str(i) for i in result]
        print(len(result))
        print(' '.join(result))
    except:
        break


4. 如何让刷题更加高效呢?

最近很多学了基础的小伙伴问我该怎么提升编程水平?学了基础该上哪刷题?明明学了很多,做项目却不知道怎么上手,其实这就是练得太少,只注重了学,却忽视了刷题,只有不断练习才能提高和巩固编程思维和能力!

链接地址,废话少说速度上号刷题卷起来👉👉:点击链接进行免费刷题学习
在这里插入图片描述
链接地址牛客网 | Python题库,废话少说速度上号!!!


网站公告

今日签到

点亮在社区的每一天
去签到