Leetcode-动态数组

# coding=utf-8
"""
@File: task_01.py
-----------------------------------------
@Author: Jack
@Time: 2020/1/6/006 19:42
@Email:jack18588951684@163.com
-----------------------------------------
"""
import ctypes


class DynamicArray:
    def __init__(self):
        self.n = 0
        self.capacity = 10
        self.A = self._make_array(self.capacity)

    def is_empty(self):
        """
        判空
        :return:
        """
        return self.n == 0

    def __len__(self):
        """
        数组长度
        :return:
        """
        return self.n

    def __getitem__(self, i):
        """
        第i个数组元素
        :param i:
        :return:
        """
        if not 0 <= i < self.n:
            raise ValueError('invalid index')
        return self.A[i]

    def append(self, obj):
        """
        数组尾部添加元素
        :param obj:
        :return:
        """
        if self.n == self.capacity:
            self._resize(2 * self.capacity)
        self.A[self.n] = obj
        self.n += 1

    def _resize(self, c):
        """
        resize数组大小
        :param c:
        :return:
        """
        B = self._make_array(c)
        for k in range(self.n):
            B[k] = self.A[k]
        self.A = B
        self.capacity = c

    @staticmethod
    def _make_array(c):
        return (c * ctypes.py_object)()

    def insert(self, k, value):
        """
        在位置k插入元素value
        :param k:
        :param value:
        :return:
        """
        if self.n == self.capacity:
            self._resize(2 * self.capacity)
        for j in range(self.n, k, -1):
            self.A[j] = self.A[j - 1]
        self.A[k] = value
        self.n += 1

    def pop(self, index=0):
        """
        移除第index个元素
        :param index:
        :return:
        """
        if index >= self.n or index < 0:
            raise ValueError('invalid index')
        for i in range(index, self.n - 1):
            self.A[i] = self.A[i + 1]
            self.A[self.n - 1] = None
            self.n -= 1

    def remove(self, value):
        """
        移除元素value
        :param value:
        :return:
        """
        for k in range(self.n):
            if self.A[k] == value:
                for j in range(k, self.n - 1):
                    self.A[j] = self.A[j + 1]
                self.A[self.n - 1] = None
                self.n -= 1
                return
        raise ValueError('value not found')

    def _print(self):
        for i in range(self.n):
            print(self.A[i], end=' ')
        print()


def function_1(N):
    """
    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
    """
    res = DynamicArray()
    for i in range(2, N + 1):
        if i % 5 == 0 or i % 7 == 0:
            res.append(i)
    res._print()


def function_2(A):
    """
    2. 托普利茨矩阵问题
    如果一个矩阵的每一方向由左上到右下的对角线上具有相同元素,那么这个矩阵是托普利茨矩阵。
    给定一个M x N的矩阵,当且仅当它是托普利茨矩阵时返回True。
    示例:
    输入:
    matrix = [
      [1,2,3,4],
      [5,1,2,3],
      [9,5,1,2]
    ]
    输出: True
    """
    for i in range(len(A) - 1):
        for j in range(len(A[0]) - 1):
            if A[i][j] != A[i + 1][j + 1]:
                return False
    return True


def function_3(nums):
    """
    3. 三数之和
    https://leetcode-cn.com/problems/3sum/
    给定一个包含 n 个整数的数组nums,判断nums中是否存在三个元素a,b,c,使得a + b + c = 0?找出所有满足条件且不重复的三元组。
    注意:答案中不可以包含重复的三元组。
    示例:
    给定数组 nums = [-1, 0, 1, 2, -1, -4],
    满足要求的三元组集合为:
    [
    [-1, 0, 1],
    [-1, -1, 2]
    ]
    """
    result = list()
    nums_len = len(nums)
    if nums_len < 3:
        return result
    l, r, dif = 0, 0, 0
    nums.sort()
    for i in range(nums_len - 2):
        if nums[i] > 0:
            break
        if i > 0 and nums[i - 1] == nums[i]:
            continue

        l = i + 1
        r = nums_len - 1
        dif = -nums[i]
        while l < r:
            if nums[l] + nums[r] == dif:
                result.append([nums[l], nums[r], nums[i]])
                while l < r and nums[l] == nums[l + 1]:
                    l += 1
                while l < r and nums[r] == nums[r - 1]:
                    r -= 1
                l += 1
                r -= 1
            elif nums[l] + nums[r] < dif:
                l += 1
            else:
                r -= 1

    return result


if __name__ == '__main__':
    function_1(100)

    A = [[1, 2, 3, 4], [5, 1, 2, 3], [9, 5, 1, 2]]
    res = function_2(A)
    print(res)

    nums = [-1, 0, 1, 2, -1, -4]
    result = function_3(nums)
    print(result)

程序输出:
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
True
[[-1, 2, -1], [0, 1, -1]]

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值