蓝桥杯备赛Day3——基础数据结构(一维数组)

目录

数据结构

什么是数据结构?

《数据结构》教材一般包含

基础数据结构

最简单的数据结构——一维数组

一维数组的定义

一维变长数组

一维正向遍历

一维反向遍历

 一维数组区间操作(实际上就是切片操作)

一维数组从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行的数字


例题

注意此处使用一维数组只能获得一部分分数,想要获得全部分数需要使用线段树。

蓝桥杯备赛Day3——基础数据结构(一维数组)_第1张图片

 暴力法
对每个区间查询,验算区间内的任意两个数,复杂度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')
    

蓝桥杯备赛Day3——基础数据结构(一维数组)_第2张图片

 暴力求解

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

你可能感兴趣的:(蓝桥杯备赛,数据结构,python数学建模算法,数据结构,算法)