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 ireturn -1arr = [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] = valarr = [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. 如图所示,1->3、3->5、5->1是一个轮回,2->4、4->6、6->2是第二个轮回,两个轮回可以原地完成对数组的轮转。问题在于需要轮转几次,每次轮转何时结束。
  2. 每次轮转何时结束:当重新回到本轮回第一个元素是结束,也就是第一个轮回到1,第二个轮回到2时结束。
  3. 需要轮转几回(走了整数数量的圈):因为从 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 Listclass Solution:def rotate(self, nums: List[int], k: int) -> None:"""Do not return anything, modify nums in-place instead."""n = len(nums)k = k % ncount = self.gcd(k, n)for i in range(count):start = ipre = nums[i+k]nums[i+k] = nums[i]i = (i+k)%nwhile  i != start:rear = nums[ (i+k) % n ]nums[(i+k) % n] = prepre = reari = (i+k)%nprint(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 = 2a.rotate(nums, k)# https://www.cnblogs.com/easonbook/p/12876402.html 关于List报错的解决


思路参考:思路二
通过推导得到

答案:

from typing import Listclass 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] = tempprint(matrix)if __name__ == '__main__':matrix = [[1,2,3],[4,5,6],[7,8,9]]a = Solution()a.rotate(matrix)

leetcode 2相关推荐

  1. leetcode 5. Longest Palindromic Substring 字符串中的最长回文数 逐步从O(n^2)优化至线性时间

    题目 解析 思路一 暴力解法 思路二 指针+最大长度 思路3 由中间至两边找回数 思路4 Manacher's algorithm 线性时间 参考文档 题目 链接 给定一个字符串 s,找到 s 中最长 ...

  2. LeetCode 10. Regular Expression Matching python特性、动态规划、递归

    前言 本文主要提供三种不同的解法,分别是利用python的特性.动态规划.递归方法解决这个问题 使用python正则属性 import reclass Solution2:# @return a bo ...

  3. leetcode Longest Substring with At Most Two Distinct Characters 滑动窗口法

    题目解析 代码如下 题目解析 这一题是一道会员的题目,题目介绍如下: Given a string, find the length of the longest substring T that c ...

  4. leetcode 3. Longest Substring Without Repeating Characters 最长非重复子串的长度 滑动窗口法

    题目链接 根据我们之前介绍的滑动窗口法的解法: 滑动窗口法详解 leetcode 438. Find All Anagrams in a String 滑动窗口法 这题,我们不难解决,使用之前的模板. ...

  5. leetcode:2680 Remove Duplicates from Sorted Array 删除数组中的重复元素

    leetcode:26 对数组元素进行去重,使得原数组重复元素最多保留1个 限制: 我们不可以额外分配数组,必须保持空间复杂度为O(1) 这个并不难实现: class Solution(object) ...

  6. LeetCode简单题之二进制表示中质数个计算置位

    题目 给你两个整数 left 和 right ,在闭区间 [left, right] 范围内,统计并返回 计算置位位数为质数 的整数个数. 计算置位位数 就是二进制表示中 1 的个数. 例如, 21 ...

  7. LeetCode简单题之删除字符使字符串变好

    题目 一个字符串如果没有 三个连续 相同字符,那么它就是一个 好字符串 . 给你一个字符串 s ,请你从 s 删除 最少 的字符,使它变成一个 好字符串 . 请你返回删除后的字符串.题目数据保证答案总 ...

  8. LeetCode简单题之找出两数组的不同

    题目 给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,请你返回一个长度为 2 的列表 answer ,其中: answer[0] 是 nums1 中所有 不 存在于 nums2 中的 ...

  9. LeetCode中等题之区域和检索 - 数组可修改

    题目 给你一个数组 nums ,请你完成两类查询. 其中一类查询要求 更新 数组 nums 下标对应的值 另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的nu ...

  10. LeetCode简单题之整理字符串

    题目 给你一个由大小写英文字母组成的字符串 s . 一个整理好的字符串中,两个相邻字符 s[i] 和 s[i+1],其中 0<= i <= s.length-2 ,要满足如下条件: 若 s ...

最新文章

  1. nagios+mysql+ndo2安装总结
  2. 科研经验1:云笔记积累个人知识体系
  3. 百度高德位置定位服务器,调用百度、高德地图App,百度地图网页版,App定位
  4. Pandas简明教程:四、Pandas数据索引方式
  5. 【Flask】ORM多对多关联关系
  6. ecshop百度编辑器远程下载无后缀的图片,并且加水印
  7. 职场人必读的10个经典励志小故事
  8. php协程和goroutine,golang中四种方式实现子goroutine与主协程的同步
  9. ADBPGGreenplum成本优化之磁盘水位管理
  10. android 贝塞尔曲线_OpenGL 实践之贝塞尔曲线绘制
  11. 完全二叉树子节点个数
  12. 阿里人告诉你毕业3年,为何技术能力相差越来越大?
  13. 在 windows 下安装 Boost 1.62.0
  14. access的papersize命令_如何在报表中使用自定义尺寸的纸张
  15. [ROS2 基础] 仿真系统和搭建方法
  16. linux 录制软件下载,Ubuntu下安装屏幕录像软件(SimpleScreenRecorder)
  17. 科技如何激发女权主义并改变男性气质
  18. 今天就给大家介绍一个抢购茅台的小技巧,不需要安装Python,不需要配置环境,就和你在电脑上安装使用QQ等软件一样
  19. 迅雷下载GitHub文件提示需要授权或登录等
  20. 二进制位运算 左移与右移

热门文章

  1. 【PyQt】记录一次完整程序设计及打包,并说说一些坑
  2. 《Complete Guide to Value Investing》读书总结
  3. 【Altium Designer21】如何改变3D视图下板子的颜色
  4. 欧姆龙CJ1W模拟量电流输入异常解决办法
  5. access查询出生日期格式转换_查找最新日期或最早日期的记录
  6. NFV领域安静的巨人要忙碌起来了
  7. JavaScript代码整洁之道-变量篇
  8. 传智播客Java JavaEE+物联网云计算 就业班
  9. 微信小程序自学(积少成多)
  10. TZOJ5942: 山区建小学(二维dp+枚举)