# 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]]