目录
数据结构
什么是数据结构?
《数据结构》教材一般包含
基础数据结构
最简单的数据结构——一维数组
一维数组的定义
一维变长数组
一维正向遍历
一维反向遍历
一维数组区间操作(实际上就是切片操作)
一维数组从a[1]开始赋值
一维数组的读入(一)
一维数组的读入(二)
一维数组的读入(三)
例题
数据结构
什么是数据结构?
每道编程题都有输入数据和输出数据,输入数据是代码处理的对象,输出数据是代码运行的结果。代码在执行过程中需要用一定的方式来存储、处理数据,就是数据结构。
《数据结构》教材一般包含
线性表(数组、链表〉、栈和队列、串、多维数组和广义表、哈希、树和二叉树、图、排序等。
基础数据结构
数组、链表、队列、栈、二叉树。
最简单的数据结构——一维数组
数组
定义:把数据连续存储在空间中。
虽然简单,但是在竞赛中至关重要,因为其他数据结构都可以用数组来模拟,即“物理存储上是数组,逻辑上是其他数据结构”。
用数组模拟其他数据结构,不是工程项目的正规做法,但是非常适合算法竟赛,因为这样编码快、不易出错。
一维数组的定义
a=['']*10 #生成空数组
print(a)
b=[0]*10 #生成以0填充的数组
print(b)
c=[0 for i in range(10)] #使用循环用0填充数组
print(c)
d=[i for i in range(0,10)] #使用循环用i填充数组
print(d)
['', '', '', '', '', '', '', '', '', '']
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Process finished with exit code 0
一维变长数组
a=[1]
for i in range(2,10):
a.append(i)
print(a)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Process finished with exit code 0
一维正向遍历
#方法一:通过数组内元素遍历
s=[0,1,2,3,4,5,6,7,8,9]
for i in s:
print(i,end=' ')
0 1 2 3 4 5 6 7 8 9
Process finished with exit code 0
#方法二:通过数字索引借助数组长度进行遍历
s=[0,1,2,3,4,5,6,7,8,9]
for i in range(0,len(s)):
print(s[i],end=' ')
0 1 2 3 4 5 6 7 8 9
Process finished with exit code 0
#方法三
s=['0','1','2','3','4']*2
for i in s:
print(int(i),end=' ')
0 1 2 3 4 0 1 2 3 4
Process finished with exit code 0
一维反向遍历
s=[0,1,2,3,4,5,6,7,8,9]
for i in range(len(s)-1,-1,-1):
print(s[i])
s=[0,1,2,3,4,5,6,7,8,9]
for i in s[::-1]:
print(i)
9
8
7
6
5
4
3
2
1
0
Process finished with exit code 0
一维数组区间操作(实际上就是切片操作)
a=[1,2,3,4,5,6,7]
print(min(a[:]))
print(min(a[2:5]))
print(max(a[2:5]))
print(max(a[2:-1]))
print(sum(a[:]))
一维数组从a[1]开始赋值
a=[0]+list(map(int,input().split())) #从a[1]开始赋值
可以再单独给a[0]赋值为0
一维数组的读入(一)
付账问题2018年第九届蓝桥杯省赛,lanqiaoOJ题号174【样例输入】
10 30
21 4 7 4 8 3 6 4 7
这里我们仅考虑如何读入题目所给数据,不考虑该题如何求解
#熟练使用map函数和split函数进行赋值十分重要
n,s=map(int,input().split())
a=list(map(int,input().split()))
for i in range(n):
print(a[i],end=' ')
in:
10 30
2 1 4 7 4 8 3 6 4 7
out:
2 1 4 7 4 8 3 6 4 7
Process finished with exit code 0
一维数组的读入(二)
求和2022年第十三届蓝桥杯省赛,lanqiaoOJ题号2080第4章【输入格式】第一行包含一个整数n,第二行包含n个整数a1, a2,-",an。
n=int(input()) #读n
a=[0]+[int(i) for i in input().split()] #读入a[1]~a[n],不使用a[0]
假如本题干中:"第二行包含n个整数a0,a2,...,an",则可以按如下方式写
n=int(input()) #读n
a=[int(i) for i in input().split()] #读a[]
一维数组的读入(三)
统计数字lanqiao0J题号535
【输入描述】
第1行是整数n,表示自然数的个数。第2~n+1行每行一个自然数。其中,1小于等于n小于等于2*10^5,每个数均不超过1.5×10^9。输入样例
8
2
4
2
4
5
100
2
100
n=int(input())
nums=[]
for i in range(n):
nums.append(int(input())) #读n行的数字
例题
注意此处使用一维数组只能获得一部分分数,想要获得全部分数需要使用线段树。
暴力法
对每个区间查询,验算区间内的任意两个数,复杂度0(n^2),共m个查询,总复杂度0(mn2),只能通过20%的测试。
100%的解法见“第25讲线段树”
n,m,x=map(int,input().split())
a=[0]+list(input().split()) #这里需要再加一个a[0],从a[1]开始
pos=[0]*(n+10)
pos[n+1]=1<<30
mp={}
for i in range(n,0,-1):
a[i]=int(a[i])
mp=[a[i]]=i
y=x^a[i]
pos[i]=pos[i+1]
if mp.get(y): pos[i]=min(pos[i],mp[y]) #注意字典的使用方法
for i in range(m):
L,R=map(int,input().split())
if pos[L]<=R: print('yes')
else: print('no')
暴力求解
n,m=map(int,input().split())
a=[0]+list(map(int,input().split()))
for i in range(m):
w=list(map(int,input().split()))
if len(w)==3: #区间询问:[L,R]的区间和
q,L,R=w
print(sum(a[L:R+1]))
else: #区间修改:把[L,R]的每个元素加上d
q,L,R,d=w
for i in range(L,R+1):
a[i]+=d