python数据结构学习笔记

今天主要在牛客网上做了两道题目,下午去南京理工大笔试面试,来总结一下今天的东西
两道题目如下

  1. 链接:https://www.nowcoder.com/questionTerminal/f652bf7904bf4905804fa3bc347fdd2a
    来源:牛客网
    P为给定的二维平面整数点集。定义 P 中某点x,如果x满足 P 中任意点都不在 x 的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有点的横坐标和纵坐标都不重复, 坐标轴范围在[0, 1e9) 内)
    如下图:实心点为满足条件的点的集合。请实现代码找到集合 P 中的所有 ”最大“ 点的集合并输出。

输入描述:
第一行输入点集的个数 N, 接下来 N 行,每行两个数字代表点的 X 轴和 Y 轴。
对于 50%的数据, 1 <= N <= 10000;
对于 100%的数据, 1 <= N <= 500000;

输出描述:
输出“最大的” 点集合, 按照 X 轴从小到大的方式输出,每行两个数字分别代表点的 X 轴和 Y轴。

思路解析:
题目要求我们需要输出的是,存在满足没有(x,y)同时大于他的点。
因此,通过分析可以知道,如果先将x按降序排序。那么我们每次只需要更新最大的y就好了。
因为,之后的出现的x不可能会比之前的大,那么满足输出的情况只要一种了,
就是之后的某个点的y比之前的大。

import sys
n = int(sys.stdin.readline().strip())
point = []
for i in range(n):
point.append(list(map(int, sys.stdin.readline().strip().split())))
point.sort(key=lambda k:k[1],reverse=True)

res = []
res.append(point[0])
for i in range(1,len(point)):
if point[i][0] > res[-1][0]:
res.append(point[i])
else:
continue
res.sort(key=lambda k:k[0])
for i in res:
print i[0],i[1]

#2
import numpy as np
p=[]

n=int(input())
for i in range(n):
a=list(map(int,input().split(’ ')))
p.append(a)

p=np.array§
indx=np.argmax(p,axis=0)
#TODO 构造直线方程
x1=p[indx[0]][0]
y1=p[indx[0]][1]
x2=p[indx[1]][0]
y2=p[indx[1]][1]
a = y2-y1
b = x1-x2
c = x2y1-x1y2
for j in range(n):
x=p[j][0]
y=p[j][1]
distance=ax+by+c
if distance>=0:
print(p[j][0]+p[j][1])
x轴最大值和y轴的最大值对应的坐标构造一条直线方程,将所有点代入到直线方程,大于0就满足。

这道题的思想比较简单,主要考验的是编程能力,
从这道理的代码里面主要学习到了:

  1. sys.stdin.readline()一个输入函数,还有另一个输入比较相象,这个函数会把首尾的空格输入所以要用,strip()把首尾元素“即空格”去掉,strip函数用法:
    #!/usr/bin/python # -- coding: UTF-8 --
    str = “123abcrunoob321”
    print (str.strip( ‘12’ )) # 字符序列为 12
    以上实例输出结果如下:
    3abcrunoob3

只要包含就删除

2.split()
str = “Line1-abcdef \nLine2-abc \nLine4-abcd”; print str.split( ); # 以空格为分隔符,包含 \n print str.split(’ ', 1 ); # 以空格为分隔符,分隔成两个
以上实例输出结果如下:
[‘Line1-abcdef’, ‘Line2-abc’, ‘Line4-abcd’]
[‘Line1-abcdef’, ‘\nLine2-abc \nLine4-abcd’]

如图sorted函数对list进行排序 x:x[i] 比较index为i的那个元素

reverse表示逆序
4.append(一个)表示list最后加元素,extend(多个)
insert()增加元素到列表的指定位置

2
给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个:
区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列 [6 2 1]则根据上述公式, 可得到所有可以选定各个区间的计算值:

[6] = 6 * 6 = 36;
[2] = 2 * 2 = 4;
[1] = 1 * 1 = 1;
[6,2] = 2 * 8 = 16;
[2,1] = 1 * 3 = 3;
[6, 2, 1] = 1 * 9 = 9;

从上述计算可见选定区间 [6] ,计算值为 36, 则程序输出为 36。
区间内的所有数字都在[0, 100]的范围内;

n=int(input())
arr=[int(x) for x in input().split()]
stack = []
arr.append(0)
result = 0
i = 0
presum = []
tempsum = 0
while i<len(arr):
if not stack or arr[i]>=stack[-1]:
presum.append(tempsum)
tempsum = 0
stack.append(arr[i])
i+=1
else:
temp = stack.pop(-1)
tempsum+=(temp+presum.pop())
result = max(tempsum*temp,result)
print(result)

#2
import sys
n = int(sys.stdin.readline().strip())
value = list(map(int,sys.stdin.readline().split()))
ans = []
for i in range(1,n+1):
ans.extend([sum(value[j:i])*min(value[j:i]) for j in range(i)])
print(max(ans))

1,这边很多上面已经讲过了,sys.stdin.readline()这是一个输入函数,
map函数这里的意思是对map(x1,x2)对所有的x2都执行x1(x1为一个函数或者可对值参数作用的代表)
2.extend就是尾增加参数(可以很多)
3.元祖和列表的区别,元组a()列表b【】
元组不可对数据进行修改,但可以+,列表可以进行任何操作
https://blog.csdn.net/zxy15771771622/article/details/79004224
4.在完成第二道题目时
参考了
https://blog.csdn.net/weixin_42001089/article/details/84203651
其中,本人思考了关于如何在python条件下,给定一组值,输出所有随机组合
看到了一个matlab
[a,b,c,d,e] = ndgrid(h1,h2,h3,h4,h5);
[a(? b(? c(? d(? e(?]
利用空间的特点,把点放到空间上,空间网格

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值