Leetcode-動態數組

# coding=utf-8
"""
@File: task_01.py
-----------------------------------------
@Author: Jack
@Time: 2020/1/6/006 19:42
@Email:[email protected]
-----------------------------------------
"""
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]]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章