数据结构练习1

Task01:数组

理论部分

理解数组的存储与分类。
实现动态数组,该数组能够根据需要修改数组的长度。

练习部分

利用动态数组解决数据存放问题

1、编写一段代码,要求输入一个整数N,用动态数组A来存放2~N之间所有5或7的倍数,输出该数组。

输入:
N = 100 

输出:
5 7 10 14 15 20 21 25 28 30 35 40 42 45 49 50 55 56 60 63 65 70 75 77 80 84 85 90 91 95 98 100
import time
def ansofn(n):
    A = []
    for i in range(2,n+1):
        if i%5==0 or i%7==0:
            A.append(i)
    print(A)
time_start=time.time()
ansofn(100)
time_end=time.time()
print('totally cost:',time_end-time_start)
[5, 7, 10, 14, 15, 20, 21, 25, 28, 30, 35, 40, 42, 45, 49, 50, 55, 56, 60, 63, 65, 70, 75, 77, 80, 84, 85, 90, 91, 95, 98, 100]
totally cost: 0.0003731250762939453
import time
def ansofn(n):
    i=1
    A=[]
    while 5*i<=n:
        A.append(5*i)
        if 7*i <=n:
            A.append(7*i)
        i=i+1
    print(list(set(sorted(A))))
time_start=time.time()
ansofn(100)
time_end=time.time()
print('totally cost:',time_end-time_start)
[5, 7, 10, 14, 15, 20, 21, 25, 28, 30, 35, 40, 42, 45, 49, 50, 55, 56, 60, 63, 65, 70, 75, 77, 80, 84, 85, 90, 91, 95, 98, 100]
totally cost: 0.00032711029052734375

2、托普利茨矩阵问题
如果一个矩阵的每一方向由左上到右下的对角线上具有相同元素,那么这个矩阵是托普利茨矩阵。
给定一个M x N的矩阵,当且仅当它是托普利茨矩阵时返回True。

# 思路:判断每个元素上面的元素和右边的元素是否相等即可, 所有的元素都符合就表示矩阵为托普利茨矩阵, 有一个元素不符合则不是, 其中第一行和最后一列不需要考虑
def isToeplitzMatrix(A):
    for i in range(1,len(A)):
        if A[i][1:] != A[i-1][:-1]:
            return False
        else:
            return True
isToeplitzMatrix([
  [1,2],
  [2,2]
])
False
isToeplitzMatrix([
  [1,2,3,4],
  [5,1,2,3],
  [9,5,1,2]
])
True

3、 三数之和
给定一个包含 n 个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a + b + c = 0?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。

def threesum(nums):
    if not nums and len(nums)<3:#空或者少于三个元素不考虑
        return False
    res = []
    nums.sort()#关键:升序排序
    for i in range(len(nums)):
        if nums[i]>0:#后面只能比它还大,所以和肯定不等于零
            return res
        if i>0 and nums[i] == nums[i-1]:#跳过重复解
            continue
        L = i+1
        R = len(nums)-1
        while L<R:
            if nums[L]+nums[i]+nums[R]==0:
                res.append([nums[i],nums[L],nums[R]])
                while nums[L] == nums[L+1]:#跳过重复元素
                    L=L+1
                while nums[R] == nums[R-1]:#跳过重复元素
                    R=R-1
                L = L+1
                R = R-1
            elif nums[L]+nums[i]+nums[R]>0:#若和大于0,则应该是nums[R]大了,左移减小
                R=R-1
            elif nums[L]+nums[i]+nums[R]<0:#若和小于0,则应该是nums[L]小了,右移增大
                L=L+1
    print(res)
threesum([-1, 0, 1, 2, -1, -4])
[[-1, -1, 2], [-1, 0, 1]]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值