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