当前位置: 首页 > news >正文

数据结构-第一期——数组(Python)

目录

00、前言:

01、一维数组 

一维数组的定义和初始化

一维变长数组 

一维正向遍历 

 一维反向遍历

一维数组的区间操作 

 竞赛小技巧:不用从a[0]开始,从a[1]开始

蓝桥杯真题练习1

读入一维数组 

例题一 

例题二​

例题三 

实战训练

实战一 :区间修改、区间求和

实战二 :异或选数

实战三:修改数组

02、多维数组 

二维数组的初始化

二维数组访问 

三维数组的初始化

三维数组访问 

蓝桥杯真题练习2

读取二维数组   

【输入字符串】 

【输入数字】 

例题一:外卖店优先级 

例题二:迷宫

实战训练

实战一:统计子矩阵

实战二:矩阵相乘 

实战三 :回行取数


00、前言:

什么是数据结构?

每道编程题都有输入数据和输出数据,输入数据是代码处理的对象,输出数据是代码运行的结果。代码在执行过程中需要用一定的方式来存储、处理数据,就是数据结构。

数据结构包含什么?

线性表(数组、链表)、栈和队列、串、多维数组和广义表、哈希、树和二叉树、图、排序等。

基础数据结构:

数组、链表、队列、栈、二叉树。


01、一维数组 

  • 把数据连续存储在空间中。
  • 虽然简单,但是在竞赛中至关重要,因为其他数据结构都可以用数组来模拟,即“物理存储上是数组,逻辑上是其他数据结构”。
  • 用数组模拟其他数据结构,不是工程项目的正规做法,但是非常适合算法竞赛,因为这样编码快、不易出错。 
  • 某些难题,可以用数组处理数据求得部分分数(暴力法

一维数组的定义和初始化

a=['']*10    # 定义空数组
b=[0]*10     # 初始化数组
print(a)
print(b)
# ['', '', '', '', '', '', '', '', '', ''],
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]# 也可以利用列表生成式来初始化
c = [0 for i in range( 10)]
d = [i for i in range(1,10)]
print(c)
print(d)
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

PS:列表生成式:[i for i in range(1,10)] 

一维变长数组 

a= []
for i in range(1,10):a.append( i )
print(a)
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

一维正向遍历 

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
s= [0,1,2,3,4,5,6,7,8,9]
for i in range(len(s)):print(s[i],end=" ")
# 0 1 2 3 4 5 6 7 8 9
s = ['1','2','3','4']*2
for i in s:print(int(i),end=" ")
# 1 2 3 4 1 2 3 4

 一维反向遍历

s = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for i in range(len(s)-1,-1,-1):# 中间的-1表示遍历到最后一个元素,即第一个元素(根据遍历方向决定,不是由数组本身决定)  print(s[i], end=" ")
# 9 8 7 6 5 4 3 2 1 0
# 比上面的方法更简洁
s = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for i in s[::-1]: print(i, end=" ")
# 9 8 7 6 5 4 3 2 1 0

一维数组的区间操作 

s = [0, 1, 2, 3, 4, 5, 6, 7]
print(min(s)) # 等价于min(s[:])              0
print(max(s[2:5])) # 左闭右开区间:[2,5)      4
print(sum(s[2:]))  #                        27  
print(sum(s[2:-1])) # -1是到倒数第二个,因为是左闭右开区间:[2,7)  20

 竞赛小技巧:不用从a[0]开始,从a[1]开始

 有时候输入是a_1,a_2,......a_n,那不从a[0]开始,从a[1]开始可以和题目下标匹配,在复杂的程序题中不容易出错。具体用法后面例题会有所体现。

# 从a[1]开始
a = [0]+list(map(int,input().split())) # 输入:1 2 3
print(a)
# [0,1,2,3]

PS: map(int,input().split())可输入多个用空格分隔的元素,并转换为int类型


蓝桥杯真题练习1

读入一维数组 

知识点:需要读取一维数组的题目的输入描述一般是:输入第一行是一个的总数n,代表数组a的元素个数。①第二行包含n个整数a1,a2,...., an。②接下来n行每行读入一个元素。下面介绍两种情况的输入方法。 

 情况①:第二行包含n个整数a1,a2,...., an。例如下面例题一、二

# 读入数字
# 法一:
n = map(int,input().split())
a= list(map(int,input().split()))        # 从a[0]开始
# a= [0]+list(map(int,input().split()))  # 从a[1]开始# 法二:
n = int(input())
a = [int(i) for i in input().split()]     # 从a[0]开始
# a= [0]+[int(i) for i in input().split()]# 从a[1]开始   

情况②:接下来n行每行读入一个元素。 例如下面例题三

n = int(input())
num = []
for i in range(n):num.append(int(input()))

例题一 

n,s = map(int,input().split())
a= list(map(int,input().split()))    # 存到列表里# 打印,查看输出情况
for i in range(n):print(a[i],end=" ")

注意:做题的过程中要多打印变量,可以保证出错了可以及时发现。 

例题二

n = int(input())
a = [int(i) for i in input().split()] # 从a[0]开始读

题目输入是a_1,a_2,......a_n,那就不从a[0]开始,从a[1]开始,可以和题目下标匹配 。

n = int(input())
a = [0]+[int(i) for i in input().split()]  # #从a[1]开始读。a[0]不用

例题三 

不在同一行读取数据:先创建一个空数组,用for循环+append()添加到数组里。

n = int(input())
num = []
for i in range(n):num.append(int(input()))

实战训练

实战一 :区间修改、区间求和

【题目描述】

给定一个长度为 N 的数组 a,其初值分别为 a1​,a2​,...,aN​。

现有 Q 个操作,操作有以下两种:

  • 1 l r k,将区间 al​,al+1​,...ar​ 的值加上 k。
  • 2 l r,求区间 al​,al+1​,...,ar​ 的和为多少。

【输入描述】

输入第 1 行包含两个正整数 N,Q,分别表示数组 a 的长度和操作的个数。

第 2 行包含 N 个非负整数 a1​,a2​,...,aN​,表示数组 a 元素的初值。

第 3∼Q−2 行每行表示一共操作,格式为以下两种之一:

  • 1 l r x
  • 2 l r

其含义如题所述。

1\leq N,Q \leq 10^5,1\leq l \leq r \leq N,-10^9\leq k,a_i\leq 10^9

【输出描述】

输出共 Q 行,每行包含一个整数,表示相应查询的答案。

【输入输出样例】

输入

5 5
1 2 3 4 5
2 1 2
1 2 3 1
2 1 3
1 1 5 1
2 1 5

输出

3
8
22

【问题解析】

区间修改和区间求和题目一般使用线段树求解,本文仅用暴力法求解,遍历m次操作,每次对n个数进行操作。 

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 = wprint(sum(a[L:R+1]))else: # # 区间修改:把[L,R]的每个元素加上dq,L, R, d = wfor i in range(L,R+1):a[i]+=d

暴力法的计算量:O(m*n),循环m次,每次对n个数进行操作。只能通过30%的测试。

暴力法只能通过30%的测试, 100%的测试:1≤n,m≤10^{5} ,要通过100%的测试的解法见“线段树”:O(mlog_2n)。 

实战二 :异或选数

2022年第十三届省赛
【问题描述】给定一个长度为 n 的数列A1,A2,... , An和一个非负整数x,给定m次查询,每次询问能否从某个区间[l,r]中选择两个数使得他们的异或等于x
【输入格式】输入的第一行包含三个整数n, m, x第二行包含n个整数A1,A2,... , An。接下来m行,每行包含两个整数li, ri表示询问区间[li, ri] 。
【输出格式】对于每个询问,如果该区间内存在两个数的异或为x则输出yes,否则输出no。
【评测用例规模与约定】对于20%的评测用例,1≤n, m ≤100;对于40%的评测用例,1 ≤n,m≤1000;对于所有评测用例,1 ≤ n, m ≤100000,0 ≤x <220,1 ≤ li ≤ri ≤n,0 ≤ Ai<220。

【知识补充】

^(异或运算符):对应二进制位相等为0,不等为1.

a = 22
b = 10
c = a^b
print(c)        # 26
print(bin(c))   # 0b11100
print(bin(a))   # 0b10110
print(bin(b))   # 0b01010
图解异或

【问题解析】

暴力法:对每个区间的左右端点进行遍历,每次遍历判断区间内的任意两个数是否存在异或为x,是的话输出“yes”,否则输出“no”。

# 暴力法获取20%测试分
n, m, x = map(int, input ().split ())
a=[0]+list (map(int, input (). split ())) #从a[1]开始
for i in range (m) :flag = 0                           # 初始化flag=0,表示不存在异或为xL,R = map(int,input().split ())    # 读取区间# 遍历区间for j in range (L,R):              # 遍历左端点for k in range(j+1, R+1):      # 遍历右端点if a[j]^a[k] == x:         # 存在异或为xflag = 1if flag == 1: # 存在异或为xprint('yes')else:         # 不存在异或为xprint ('no')

对每个区间查询,验算区间内的任意两个数,复杂度0(n^{2}),共m个查询,总复杂度0(mn^{2}), 比赛限制最多只能循环10^7次,20%的测试循环100^3=10^6次,40%的测试循环1000^3=10^9次,所以只能通过20%的测试。 

【正解】通过100%的测试解法应使用“线段树” 解法。  

实战三:修改数组

题目描述

给定一个长度为 N 的数组 A=[A1​,A2​,⋅⋅⋅,AN​],数组中有可能有重复出现的整数

现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A2​,A3​,⋅⋅⋅,AN​。

当修改 Ai​ 时,小明会检查Ai​ 是否在 A_1 \sim A_{i-1}中出现过。如果出现过,则小明会给 Ai​ 加上 1 ;如果新的 Ai​ 仍在之前出现过,小明会持续给 Ai​ 加 1 ,直 到 Ai​ 没有在A_1 \sim A_{i-1}中出现过。 

当 AN​ 也经过上述修改之后,显然 A 数组中就没有重复的整数了。

现在给定初始的 A 数组,请你计算出最终的 A 数组。

输入描述

第一行包含一个整数 N。

第二行包含 N 个整数 A1​,A2​,⋅⋅⋅,AN​。

其中,1 \leq N \leq 10^5,1 \leq A_i \leq 10^6

输出描述

输出 N 个整数,依次是最终的 A1​,A2​,⋅⋅⋅,AN​。

输入输出样例

输入

5
2 1 1 3 4

输出

2 1 3 4 5

【问题解析】 

 暴力法
每遍历一个新的数,就检查前面是否出现过,每一次需要检查前面所有的数共有n个数,每个数检查0(n)次,所以总复杂度是0(n^{2})的,超时。

n = int(input( ))
A = [int(i) for i in input().split()] # 读入A1​,A2​,⋅⋅⋅,AN​存到列表里
for i in range(1,n):while A[i] in A[0:i]: # 检查之前有没有出现过,直到没有出现才退出A[i] += 1         # 出现过就+1
for i in A:print(i,end =" ")

【正解】通过100%的测试解法应使用“并查集 ” 解法

点击链接查看该题的并查集解法:数据结构-第七期——并查集的应用(Python)


02、多维数组 

二维数组的初始化

# 两个for循环初始化
p = [[0 for i in range(5)]for j in range(2)]# 一个for循环初始化(推荐)
p = [[0]*5 for i in range(2)]
# [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]

二维数组访问 

s=[[1,2,3],[4,5,6]]
# 遍历子数组元素
for i in range(2):     # 子数组for j in range(3): # 子数组元素print(s[i][j],end=" ")
# 1 2 3 4 5 6

三维数组的初始化

p = [[[0 for _ in range(3)]for __ in range(4)]for ___ in range(2)]
p = [[[0]*3 for __ in range(4)]for ___ in range(2)]
print(p)
# [[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]]# 三维列表(维度:2,3,4)存放0-23
n,m,k = 2,3,4
p = [[[i+k*j+k*m*l for i in range(k)]for j in range(m)]for l in range(n)]
print(p)
# [[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]

三维数组访问 

a = [[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]
for i in range(2):for j in range(3):for k in range(4):print(a[i][j][k],end=" ")
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

蓝桥杯真题练习2

读取二维数组   

知识点:需要读取二维数组的题目的输入描述一般是:输入第一行是两个的正整数m, n,表示矩阵的行和列。接下来m行每行n个数/字符串(,用空格隔开),表示这个矩阵。下面介绍输入字符串和输入数字的方法。

【输入字符串】 

  •  如果输入需要用空格隔开,代码需要加多一个split()。(情况少见)
m,n = map(int,input().split())
a = []
for  i in range(m):a.append(list(input().split()))
  • 如果输入不需要用空格隔开 ,例如下面的例题二。
m,n = map(int,input().split())
a = []
for  i in range(m):a.append(list(input()))
# 虽然输入没有隔开,但list会将输入的字符串拆成单字符存到列表

 【输入数字】 

 一般都是要用空格隔开的,并且要转换成整数类型。例如下面的例题一。

n, m= map( int, input( ).split( ))
a=[]
for i in range(m):a.append([int(i) for i in input( ).split( )])

例题一:外卖店优先级 

2019年第十届蓝桥省赛

仅要求读取数据即可

【输入描述】

第一行包含 3 个整数 N,M,T。

以下 M 行每行包含两个整数 ts,id,表示 ts 时刻编号 id 的外卖店收到一个订单。

其中,1 \leq N,M,T \leq 10^5,1 \leq ts \leq T,1 \leq id \leq N

【输入样例】

2 6 6
1 1
5 2
3 1
6 2
2 1
6 2

【代码展示】  

n, m, T = map( int, input( ).split( ))
a=[]
priorty = []
for i in range(m):a.append([int(i) for i in input( ).split( )])

PS:读入一行并拆开,存放到数组:a.append([int(i) for i in input( ).split( )])

例题二:迷宫

2017年第八届蓝桥杯省赛,填空题,1anqiao0J题号641 

仅要求读取数据即可

【问题描述】
给出一个迷宫,问迷宫内的人有多少能走出来。迷宫如右图所示:每个位置上有一个人,共100人。每个位置有指示牌,L表示向左走,R表示向右走,U表示向上走,D表示向下走。开始的时候,直升机把 100 名玩家放入一个个小房间内。玩家一定要按照地上的字母移动。

请你计算一下,最后,有多少玩家会走出迷宫,而不是在里边兜圈子?

【输入描述】

输入10行,每行10个字母(U、D、L、R)

【输入样例】

UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR

如果你还没明白游戏规则,可以参看下面一个简化的 4x4 迷宫的解说图:

【代码演示】 

m,n = map(int,input().split())
mp = []
for  i in range(m):a.append(list(input()))
print(mp)
# 也可以用下面的方法
mp =[[''*10] for i in range(10 )] # 初始化二维数组:用来存迷宫
for i in range(10):mp[i]=list(input( )) #二维矩阵存迷宫:一次读入一行(一维数组),用空格分隔# list将读入的字符串拆开放到列表里
print(mp)# 演示(这里只输入一行)
# 输入:UDDLUULRUL
# 输出:[['U', 'D', 'D', 'L', 'U', 'U', 'L', 'R', 'U', 'L'], [''], [''], [''], [''], [''], [''], [''], [''], ['']]

正解:DFS搜索  


实战训练

实战一:统计子矩阵

 2022年第十三届省赛15分lanqiaoOj题号2109

问题描述

给定一个 N×M 的矩阵 A, 请你统计有多少个子矩阵 (最小 1×1, 最大N×M) 满足子矩阵中所有数的和不超过给定的整数 K ?

输入格式

第一行包含三个整数 N,M 和 K.

之后 N 行每行包含 M 个整数, 代表矩阵 A.

输出格式

一个整数代表答案。

样例输入

3 4 10
1 2 3 4
5 6 7 8
9 10 11 12

样例输出

19

样例说明

满足条件的子矩阵一共有 19 , 包含:

大小为 1×1 的有 10 个。

大小为 1×2 的有 3 个。

大小为 1×3 的有 2 个。

大小为 1×4 的有 1 个。

大小为 2×1 的有 3 个。

评测用例规模与约定

对于 30% 的数据, N,M≤20.

对于 70% 的数据, N,M≤100.

对于 100% 的数据, 1≤N,M≤500;0≤A_{ij}​≤1000;1≤K≤250000000.

【处理输入】
Python如何读矩阵?

  • 定义矩阵a[ ][ ]
  • 从a[1][1]读到a[n][m](不用第零行和第零列,从a[1][1]开始)

【思路】(暴力法)

  • 用i1、i2、 j1、j2框出一个子矩阵
  • 用i、j两重for循环统计子矩阵和

【复杂度】

6个for循环,O(N^6)

【代码演示】 

 暴力法: 通过30%测试

n, m, k = map(int, input().split())
a = [[0] for i in range(n)]
# print(a) # 多打印,没坏处
a.insert(0,[0]*(m+1))        # 在第0行插入一行0(不用第零行)
for i in range(1, n + 1):    # 每行a[0]不用,即第一列为0(不用第零列)a[i].extend(map(int, input().split()))
# print(a)
ans = 0
# 四条边,每次移动一边,需要四个for循环遍历所有可能的矩阵
# 前四个for循环遍历矩阵
for i1 in range(1,n+1):              # 上边for i2 in range(i1,n+1):         # 下边for j1 in range(1,m+1):      # 左边for j2 in range(j1,m+1): # 右边sum = 0# 对所有可能的矩阵内部进行求和for i in range(i1,i2+1):   # 后两个for循环矩阵求和for j in range(j1,j2+1):sum += a[i][j]if sum <= k:  # 找出满足要求的矩阵ans += 1
print(ans)

【正解】使用“前缀和 ”来求解,可以通过100%的测试(点击链接可以查看前缀和求解该题)

实战二:矩阵相乘 

矩阵相乘lanqiao0J题号1550 

题目描述

输入两个矩阵,输出两个矩阵相乘的结果。

输入描述
输入的第一行包含三个整数n,m,k,表示n×m的矩阵和m×k的矩阵。接下来n行,每行m个整数。再接下来m行,每行k个整数。0<n, m, k≤100,0≤矩阵中的每个数≤1000。
输出描述
输出n行,每行k个整数,表示矩阵相乘的结果。

输入输出样例

输入

2 1 3
1
2
1 2 3

输出

1 2 3
2 4 6

 【问题解析】

n,m,k = map( int , input( ).split( ))
A =[]
B =[]
C = [[0]*k for i in range(n)]
for i in range(n):   A.append(list(map( int , input( ).split( ))))# 读入a矩阵
for i in range(m):   B.append(list(map( int , input( ).split( ))))# 读入b矩阵
# 三个for循环计算矩阵乘法
for i in range(n):  # 累加n次for j in range(m):for l in range(k):c[i][l] += A[i][j]*B[j][l]
# 打印矩阵C
for i in range(n):for j in range(k):   print(C[i][j],end=" ")print()            #换行

实战三 :回行取数

回形取数lanqiao0J题号1517

题目描述

回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。

输入描述

输入第一行是两个不超过 200 的正整数 m,n,表示矩阵的行和列。接下来 m 行每行 n 个整数,表示这个矩阵。

输出描述

输出只有一行,共 mn 个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。

输入输出样例

输入

3 3
1 2 3
4 5 6
7 8 9

输出

1 4 7 8 9 6 3 2 5

【解题思路】 

这道题不是正常的二维数组遍历,而是以一种特殊的方式遍历,所以本题不使用二维数组,用一维数组即可。

  1. 初始化:x,y=-1,0,表示还没进入矩阵
  2. 每走一步sum就加一,当sum>m*n(总数)时 ,表示已经遍历完矩阵。
  3. 判断是否出错(出界和走到了取过的数),是的话就回到回到出错前调整方向后再走,否则就按照原来的发现继续前进。
  4. 走过的数就输出,并标记这个数为已经取过了

【代码演示】 

dir = [(1,0),(0,1),(-1,0),(0,-1)]  #4个方向
m, n = map( int, input( ).split( ))
a=[]
for i in range(m): a.append(input( ).split( ))
x, y = -1,0             # 还没有加入矩阵
d=0
# 下面三行可以用 for i in range(m*n): 代替
sum = 0                 # 统计走了多少个数
while sum < m*n:        # 没有走完m*n个数就一直走sum = sum + 1nx, ny = x + dir[d][0], y + dir[d][1]if nx < 0 or nx >= m or ny < 0 or ny >= n or a[nx][ny]==-1:# 出错:走出边界/走到了取过的数d =(d +1)%4    # 调整方向。循环链表操作:取余x, y = x + dir[d][0], y + dir[d][1] # 回到出错前调整方向后再走else:      # 没有出界和取过的数就按照原来方向前进x, y = nx, nyprint(a[x][y], end='')         # 输出当前走到的数a[x][y] = -1                   # 标记这个坐标点已经取过

第1行用dir数组表示4个方向,代码简短很多。dir[0]表示向右前进一步,dir[1]表示向上前进一步,dir[2]表示向左前进一步,dir[3]表示向下前进一步。 

感谢观看,下期再见!

相关文章:

数据结构-第一期——数组(Python)

目录 00、前言&#xff1a; 01、一维数组 一维数组的定义和初始化 一维变长数组 一维正向遍历 一维反向遍历 一维数组的区间操作 竞赛小技巧&#xff1a;不用从a[0]开始&#xff0c;从a[1]开始 蓝桥杯真题练习1 读入一维数组 例题一 例题二​ 例题三 实战训…...

八 动手学深度学习v2 ——卷积神经网络之卷积+填充步幅+池化+LeNet

目录 1. 图像卷积总结2. 填充和步幅 padding和stride3. 多输入多输出通道4. 池化层5. LeNet 1. 图像卷积总结 二维卷积层的核心计算是二维互相关运算。最简单的形式是&#xff0c;对二维输入数据和卷积核执行互相关操作&#xff0c;然后添加一个偏置。核矩阵和偏移是可学习的参…...

SparkCore

第1章 RDD概述 1.1 什么是RDD RDD&#xff08;Resilient Distributed Dataset&#xff09;叫做弹性分布式数据集&#xff0c;是Spark中最基本的数据抽象。代码中是一个抽象类&#xff0c;它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。 RDD类比工厂生产。 …...

配置 Windows 系统环境变量

直接按键盘上面的 WINS 打开 Windows 搜索 搜索“编辑系统环境变量” 也可以右键此电脑->属性->高级系统设置打开相同的界面 点击环境变量 一般添加就是添加在框出的 Path 里面&#xff0c;双击可以看到现有的环境变量并进行编辑 例如我在博客中写把 Java 的 jdk 解压好…...

【计算机视觉】图片文件格式的讲解

文章目录 一、图片的压缩二、计算机表示颜色三、JPG和PNG3.1 JPG3.2 PNG 一、图片的压缩 图片文件格式有可能会对图片的文件大小进行不同程度的压缩&#xff0c;图片的压缩分为有损压缩和无损压缩两种。 有损压缩。指在压缩文件大小的过程中&#xff0c;损失了一部分图片的信…...

2023最全的性能测试种类介绍,这6个种类特别重要!

系统的性能是一个很大的概念&#xff0c;覆盖面非常广泛&#xff0c;包括执行效率、资源占用、系统稳定性、安全性、兼容性、可靠性、可扩展性等&#xff0c;性能测试就是描述测试对象与性能相关的特征并对其进行评价而实施的一类测试。 性能测试是一个统称&#xff0c;它其实包…...

代码随想录算法训练营19期第43天

1049. 最后一块石头的重量 II 视频讲解&#xff1a;动态规划之背包问题&#xff0c;这个背包最多能装多少&#xff1f;LeetCode&#xff1a;1049.最后一块石头的重量II_哔哩哔哩_bilibili 代码随想录 初步思路&#xff1a;动态规划。 总结&#xff1a;套用01背包 dp[j…...

微信小程序wx.previewImage实现图片预览

在微信小程序中&#xff0c;wx.previewImage函数用于预览图片&#xff0c;可以将一组图片以轮播的方式展示给用户&#xff0c;并支持用户手势操作进行切换。 使用wx.previewImage函数需要传入一个参数对象&#xff0c;该对象包含以下属性&#xff1a; current: String&#x…...

Java实现Modbus读写数据

背景 由于当时项目周期赶&#xff0c;引入了一个PLC4X组件&#xff0c;上手快。接下来就是使用这个组件遇到的一些问题&#xff1a; 关闭连接NioEventLoop没有释放导致oom设计思想是一个设备一个连接&#xff0c;而不是一个网关一个连接连接断开后客户端无从感知 前两个问题解…...

C++11新特性⑤ | 仿函数与lambda表达式

目录 1、引言 2、仿函数 3、lambda表达式 3.1、lambda表达式的一般形式 3.2、返回类型说明 3.3、捕获列表的规则 3.4、可以捕获哪些变量 3.5、lambda表达式给编程带来的便利 VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&a…...

解决websocket不定时出现1005错误

后台抛出异常如下&#xff1a; Operator called default onErrorDropped reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: WebSocket close status code does NOT comply with RFC-6455: 1005 Caused by: java.lang.IllegalArgume…...

文章内容生成随机图像,并将这些图像上链

一、需求背景 在当前的互联网时代,信息越来越快速地传播,一篇好的文章不仅需要有吸引人的文字内容,还需要有精美的配图。但是,对于某些只有文字,而没有图片的文章,我们可以使用程序去生成随机的图片来作为文章的配图。 本文将详细介绍如何使用Java语言实现文章内容生成…...

l8-d9 UDP通信实现

一、函数接口扩展与UDP通信实现流程 1.write/read到send/recv 函数原型&#xff1a; ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t recv(int sockfd, void *buf, size_t len, int flags); 前三个参数同read/write一样&#xff1b; ssize_t rea…...

MongoDB复杂聚合查询与java中MongoTemplate的api对应

MongoDB聚合json脚本 db.getCollection("202303_refund").aggregate([{"$match": {"courseType": "常规班课","teacherRefundReasonCheck": true,"teacherId": {"$in": [7544]},"createTime"…...

WireShark抓包工具的安装

1.下载安装包 在官网或者电脑应用商城都可以下载 2.安装 打开安装包&#xff0c;点击next 点击next 选择UI界面&#xff0c;两种都装上 根据习惯选择 选择安装位置点击安装 开始安装安装成功...

审计智能合约的成本是多少?如何审计智能合约?

审计智能合约的成本是多少&#xff1f;如何审计智能合约&#xff1f; 智能合约安全审计在去中心化金融 (DeFi) 生态系统中非常普遍。如果您投资了一个区块链项目&#xff0c;您的决定可能部分基于智能合约代码审查的结果。 虽然大多数人都了解审计对网络安全的重要性&#xff…...

9.7 校招 内推 面经

绿泡*泡&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | Momenta 2024校招火热进行中&#xff01;新增招聘岗位&#xff08;内推&#xff09; 校招 | Momenta 2024校招火热进行中&#xff01;新增招聘岗位&#xff08;内推&#xff09; 2、…...

【网络编程】IO多路复用

IO多路复用是一种高效的I/O处理方式&#xff0c;它允许单个进程能够同时监视多个文件描述符&#xff08;sockets、文件等&#xff09;&#xff0c;并在其中任何一个文件描述符准备好进行I/O操作时进行处理。它的核心在于使用少量的线程或进程来管理多个I/O操作&#xff0c;以提…...

MySQL与postgreSQL数据库的区别

MySQL 是一个流行的开源关系型数据库管理系统&#xff0c;具有以下优势&#xff1a; 开源和免费&#xff1a;MySQL 是一个开源软件&#xff0c;允许用户免费下载、使用和修改。它的免费版本&#xff08;Community Edition&#xff09;提供了广泛的功能&#xff0c;适用于大多数…...

单片机电子元器件-按键

电子元器件 按键上有 四个引脚 1 2 、 3 4 按下之后 导通 1 3 、 2 4 初始导通 通常按键开关为机械弹性开关&#xff0c;开关在闭合不会马上稳定的接通&#xff0c;会有一连串的抖动 抖动时间的长短有机械特性来决定的&#xff0c;一般为5ms 到10 ms 。 消抖的分类 硬件消…...

Nacos docker实现nacos高可用集群项目

目录 Nacos是什么&#xff1f; Nacos在公司里的运用是什么&#xff1f; 使用docker构建nacos容器高可用集群 实验规划图&#xff1a;​编辑 1、拉取nacos镜像 2、创建docker网桥&#xff08;实现集群内的机器的互联互通&#xff08;所有的nacos和mysql&#xff09;&#x…...

基于Dubbo实现服务的远程调用

目录 前言 RPC思想 为什么使用Dubbo Dubbo技术框架 ​编辑 调用关系流程 基础实现 A.提供统一业务Api B.编辑服务提供者Product B.a 添加依赖 B.b 添加Dubbo 配置(基于yaml配置文件) B.c 编写并暴露服务 C.编辑服务消费者 C.a 添加依赖 C.b 添加Dubbo配置 C.c 引用…...

Redis事务的理解

介绍 Redis通过MULTI、EXEC、WATCH等命令来实现事务功能。 事务提供了一种将多个命令请求打包&#xff0c;然后一次性、按照顺序地执行多个命令的机制&#xff0c;并且在事务执行期间&#xff0c;服务器不会因为其他客户端请求而中断事务的执行功能&#xff0c;他会将事务中的…...

PostgreSQL安装异常,服务无法启动导致创建服务器超时

win上安装pg后无法创建服务器&#xff0c;提示创建超时&#xff0c;发现服务列表里面pg15服务 并没有启动&#xff0c;启动服务器发现服务不了&#xff0c;截图忘记截了&#xff0c;复现不了&#xff0c;解决方法是 换个身份&#xff0c;然后继续启动&#xff0c;然后就可以在…...

汽车电子系统网络安全解决方案

声明 本文是学习GB-T 38628-2020 信息安全技术 汽车电子系统网络安全指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 汽车电子系统网络安全范围 本标准给出了汽车电子系统网络安全活动框架&#xff0c;以及在此框架下的汽车电子系统网络安全活动…...

切片机制和MR工作机制

切片机制 默认的切片大小和块大小一致&#xff0c;切片的个数决定了MapTask的个数。 数据倾斜问题&#xff1a;如果某个切片的大小太小&#xff0c;会浪费了MapTask申请的CPU资源。 如果剩余数据长度大于128*1.1, 就切片成2份&#xff0c;否则就不进行切分了。 InputFormat基…...

【postgresql 基础入门】基础架构和命名空间层次,查看数据库对象再也不迷路

postgresql 基础架构 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献&#xff1a; toadb开源库 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&…...

是的,决定放弃算法去机器学习了

可是梦想啊&#xff01;~她永存心间&#xff01;&#xff01;&#xff01; 我啊~本是执着于这些算法的怪咖&#xff0c;梦想是icpc&#xff0c;ccpc~ 可是啊~ 在以后的科研和工作中&#xff0c;这些算法很多都是用不到的&#xff0c;学习算法更重要的目的是锻炼编程能力和分析…...

Python 03(循环语句)

Python03&#xff08;循环语句&#xff09; 文章目录 Python03&#xff08;循环语句&#xff09;一、while语句二、while实现猜数字三、while循环的嵌套while循环嵌套实例需求&#xff1a; 四、for循环1、什么 是for循环2、语法3、执行流程4、for循环的基本使用5、range()函数6…...

安科瑞铁塔基站能耗监控解决方案

安科瑞 华楠 1 背景概述 5G发展&#xff0c;基站先行。5G基站的选址建设&#xff0c;是保证5G信号覆盖的基础&#xff0c;因此5G基站建设是5G产业布局的一部分&#xff0c;也是5G成熟的基础。 2G、3G、4G均是低频段信号传输&#xff0c;宏基站几乎能应付所有的信号覆盖。但由…...