python数组
1.数组
1.1数组基础知识
数组(Array):一种线性表数据结构。它使用一组连续的内存空间,来存储一组具有相同类型的数据。
数组的基本操作:
访问元素
# 从数组 nums 中读取下标为 i 的数据元素值
def value(nums, i):
if 0 <= i <= len(nums) - 1:
print(nums[i])
arr = [0, 5, 2, 3, 7, 1, 6]
value(arr, 3)
查找元素
# 从数组 nums 中查找元素值为 val 的数据元素第一次出现的位置
def find(nums, val):
for i in range(len(nums)):
if nums[i] == val:
return i
return -1
arr = [0, 5, 2, 3, 7, 1, 6]
print(find(arr, 5))
插入元素
(在数组尾部插入值为 val 的元素)
arr = [0, 5, 2, 3, 7, 1, 6]
val = 4
arr.append(val)
print(arr)
(在数组第 i 个位置上插入值为 val 的元素)
arr = [0, 5, 2, 3, 7, 1, 6]
i, val = 2, 4
arr.insert(i, val)
print(arr)
改变元素
def change(nums, i, val):
if 0 <= i <= len(nums) - 1:
nums[i] = val
arr = [0, 5, 2, 3, 7, 1, 6]
i, val = 2, 4
change(arr, i, val)
print(arr)
删除元素
(删除数组尾部元素)
arr = [0, 5, 2, 3, 7, 1, 6]
arr.pop()
print(arr)
(删除数组第 i 个位置上的元素)
arr = [0, 5, 2, 3, 7, 1, 6]
i = 3
arr.pop(i)
print(arr)
(基于条件删除元素)
arr = [0, 5, 2, 3, 7, 1, 6]
i = 3
arr.remove(5)
print(arr)
思路:我自己思路和思路二相似,但是没有想到,需要多次便利,才能遍历所有元素。参见思路二
- 如图所示,1->3、3->5、5->1是一个轮回,2->4、4->6、6->2是第二个轮回,两个轮回可以原地完成对数组的轮转。问题在于需要轮转几次,每次轮转何时结束。
- 每次轮转何时结束:当重新回到本轮回第一个元素是结束,也就是第一个轮回到1,第二个轮回到2时结束。
- 需要轮转几回(走了整数数量的圈):因为从 0 开始不断遍历,最终又回到起点 0,这个过程走了a圈(a正为整数),每圈的长度为n。 这个过程中,走的每一步的长度为k,共走过了b个元素,所以走的总步长为bk,也即这a圈的长度,即an=bk。 即 an 一定为 n,k 的公倍数。又因为我们在第一次回到起点时就要结束,因此a要最小,故an就是n,k的最小公倍数lcm(n,k) , 因此 b 就为lcm(n,k)/k,这说明从起点再次回到起点的过程中会访问到 lcm(n,k)/k 个元素。 为了访问到所有的元素,我们需要进行遍历的次数为,n/lcm(n,k)/k = n*k/lcm(n,k) = gcd(n,k)(最大公约数和最小公倍数的关系) 即需要遍历的次数为n和k的最大公约数。
答案:
from typing import List
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
k = k % n
count = self.gcd(k, n)
for i in range(count):
start = i
pre = nums[i+k]
nums[i+k] = nums[i]
i = (i+k)%n
while i != start:
rear = nums[ (i+k) % n ]
nums[(i+k) % n] = pre
pre = rear
i = (i+k)%n
print(nums)
def gcd(self,a, b):
if(b==0):
return a
else:
return self.gcd(b,a%b)
if __name__ == '__main__':
a = Solution()
nums = [-1,-100,3,99]
k = 2
a.rotate(nums, k)
# https://www.cnblogs.com/easonbook/p/12876402.html 关于List报错的解决
思路参考:思路二
通过推导得到
答案:
from typing import List
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
n = len(matrix)
for i in range(n//2):
for j in range( (n+1) // 2):
temp = matrix[i][j]
matrix[i][j] = matrix[n-j-1][i]
matrix[n-j-1][i] = matrix[n-i-1][n-j-1]
matrix[n-i-1][n-j-1] = matrix[j][n-i-1]
matrix[j][n-i-1] = temp
print(matrix)
if __name__ == '__main__':
matrix = [[1,2,3],[4,5,6],[7,8,9]]
a = Solution()
a.rotate(matrix)