实现一个支持动态扩容的数组
class DynamicArray:
def __init__(self):
self._n = 0
self._capacity = 10
self._A = self._make_array(self._capacity)
def __len__(self):
return self._n
def is_empty(self):
return self._n == 0
# O(1)
def __getitem__(self, k):
if not 0 <= k < self._n:
raise ValueError('invalid index')
return self._A[k]
# O(1)
def append(self, obj):
if self._n == self._capacity: # 首先要判断该容器是否放得下
self._resize(2 * self._capacity)
self._A[self._n] = obj
self._n += 1
def _make_array(self, c):
return c * [None]
def _resize(self, c):
B = self._make_array(c)
for k in range(self._n):
B[k] = self._A[k]
self._A = B
self._capacity = c
# O(n)
def insert(self, k, value):
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
# O(n)
def remove(self, value):
for k in range(self._n):
if self._A[k] == value: # 一个个查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()
if __name__ == '__main__':
mylist = DynamicArray()
print('size was: ', str(len(mylist)))
mylist.append(10)
mylist.append(20)
mylist.append(30)
mylist.insert(0, 0)
mylist.insert(1, 5)
mylist.insert(3, 15)
mylist._print()
mylist.remove(20)
mylist._print()
print('size is: ', str(len(mylist)))
实现一个大小固定的有序数组,支持动态增删改操作
class DynamicArray:
def __init__(self):
self._n = 0
self._capacity = 10
self._A = self._make_array(self._capacity)
def __len__(self):
return self._n
def is_empty(self):
return self._n == 0
# O(1)
def __getitem__(self, k):
if not 0 <= k < self._n:
raise ValueError('invalid index')
return self._A[k]
# O(1)
def append(self, obj):
if self._n == self._capacity: # 首先要判断该容器是否放得下
self._resize(2 * self._capacity)
self._A[self._n] = obj
self._n += 1
def _make_array(self, c):
return c * [None]
def _resize(self, c):
B = self._make_array(c)
for k in range(self._n):
B[k] = self._A[k]
self._A = B
self._capacity = c
# O(n)
def insert(self, k, value):
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
# O(n)
def remove(self, value):
for k in range(self._n):
if self._A[k] == value: # 一个个查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()
if __name__ == '__main__':
mylist = DynamicArray()
print('size was: ', str(len(mylist)))
mylist.append(10)
mylist.append(20)
mylist.append(30)
mylist.insert(0, 0)
mylist.insert(1, 5)
mylist.insert(3, 15)
mylist._print()
mylist.remove(20)
mylist._print()
print('size is: ', str(len(mylist)))
实现两个有序数组合并为一个有序数组
def merge(list1, list2):
res = []
while len(list1) > 0 and len(list2) > 0:
res.append(list1.pop(0) if list1[0] < list2[0] else list2.pop(0))
res.extend(list1)
res.extend(list2)
return res
if __name__ == '__main__':
list1 = [1, 4, 8, 9, 21, 42]
list2 = [3, 9, 15, 16, 19, 36, 39, 84, 91, 127]
print(merge(list1, list2))