Python数组学习20241230

written by 五氧化二钒

数组

带着问题来学习:

问题1.数组和列表、集合之间有什么不同?

解决思路:画出表格,做总结。

答:

数据结构顺序长度元素类型重复元素Python
集合没有顺序 不可以通过下标访问长度可变 .add()增加元素 .remove()删除元素 .clear()清空集合没限制没有重复元素set1 = {1,2,3} 只声明{}是字典
列表 (线性列表) (链表)有顺序 可以通过list1[n]访问长度可变 .append()增加元素 .remove()删除第一个匹配到的元素 .pop(n)弹出索引为n的元素 .pop()弹出最后一个元素 .clear()清空列表没限制可以有重复元素list1 = []
元组有顺序 可以通过tup1[n]访问长度不可变 元素也不可变,不能增加删除修改没限制可以有重复元素tup1 = (1,"帅")
字典3.10版有顺序 可以通过键访问值长度可变 增加/修改元素dict[key] = value 删除元素del my_dict['age'] 清空元素my_dict.clear()字典的值没有限制 字典的键必须是不可变的不能重复,键值对一一对应my_dict = {'键1': 1, '键2': 2, '键3': 3}

问题2.如何理解数组的读取、查找、插入、删除等 基本操作

解决思路:描述数组的操作过程。

答:

数组的操作操作步骤时间复杂度
读取元素1.找到当前数组索引为0的位置。 2.将内存地址加上索引值,即为目标位置。O(1)
查找元素1.找到当前数组索引为0的位置。 2.逐个向后检测O(N)
插入元素(尾部)1.根据数组首地址和长度,计算出末尾地址,直接插入即可。O(1)
插入元素(中间)1.将要插入位置的元素和之后的元素挨个向后移一位。 2.插入到目标位置。O(N)
删除元素1.删除当前元素位置。 2.之后元素逐个上位一位。O(N)

例题1.寻找数组的中心索引

给你一个整数数组 nums ,请计算数组的 中心下标 。

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。

原题链接1991. 找到数组的中间位置 - 力扣(LeetCode)

解题思路:

class Solution:
    
    def findMiddleIndex(self, nums):
        #先计算总和吧
        total = sum(nums)
​
        sumleft = 0
        sumright = 0
        #遍历吧
        for i in range(len(nums)):
            #看看左边(包括自身)
            
            sumleft = sumleft + nums[i]
​
            #看看右边(不包括自身)
            #右边可以用总的减左边的
            
            sumright = total - sumleft
​
            if sumleft-nums[i] == sumright:
                return i
        return -1
​
nums = []
solu = Solution()
n = solu.findMiddleIndex(nums)
print(n)

例题2.搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

原题链接:

解题思路:遍历寻找即可

答1(实现了插入):

class Solution:
    def searchInsert(self, nums, target) :
        #先判断是否在数组中
        if(target in nums):
            #存在,完成
            n = nums.index(target)
            return n
        else:
            #不存在
            #找自己的位置
            #第一种寻找方法:顺序查找
            for i in range(len(nums)):
                if target < nums[i]:
                    nums.append(None)
                    #挨个移后方元素(包括i)
                    for j in range(len(nums)-i-1):
                        nums[-(j+1)] = nums[-(j+2)]
                    nums[i] = target
                    return nums
                else:
                    continue
​
            nums.append(target)
            return nums
​
solution = Solution()
print(solution.searchInsert([1,2,4,5,6],7))

答2(只找到插入位置即可):

class Solution:
    def searchInsert(self, nums, target) :
        #数字位于数组中时,输出下标
        if(target in nums):
            return nums.index(target)
        else:
            
            #遍历,如果target小于某一个数了,那么这个数下标就是要插入的位置
            for i in range(len(nums)):
                if target < nums[i]:
                    return i
                else:
                    continue
                
            #遍历完成后,若没有return
            return len(nums)
​
solu = Solution()
print(solu.searchInsert([1,2,3,4],5))

例题3.合并区间

解决思路:覆盖的区域都染色成1,没覆盖的不染色默认0。最后全部遍历一遍,输出结果。

答:

问题3.数组在内存中是如何存放的?

例题4.在你常用的语言中,如何对数组执行初始化、数据访问、修改、迭代、排序、添加、删除等操作?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值