Task 1 ---- 数组
题目:
- 实现一个支持动态扩容的数组
- 实现一个大小固定的有序数组,支持动态增删改操作
- 实现两个有序数组合并为一个有序数组
说明:
- 由于工作时间原因,此次的比较粗糙,部分地方偷懒了
- 此处使用了python自带的list,按道理说应该去查看python源码,来构造
- 个人觉得最理想的应该是了解计算机底层原理,自己开辟内存实现,但是由于难度较大,需要底层原理,此处暂时搁置,待以后会继续完善
- 这里我将三个题目写在一个文件,其中参数说明:
def __init__(self, *args, size=None, fixed_size=False):
"""
:param args: 可以直接初始生成数组,例如 list_exmple = OwnArray(1, 2, 3, 4)
:param size: 指定数组长度
:param fixed_size: 指定数组是否长度固定
"""
def append(self, value, sorted=False):
"""
:param value: append 的参数, 支持list
:param sorted: 是否排序,需要完善
:return:
"""
源码
class OwnArray:
def __init__(self, *args, size=None, fixed_size=False):
if not isinstance(fixed_size, bool) and fixed_size:
raise TypeError("Fixed size must be bool")
self._fixed = fixed_size
if args:
self._data = [i for i in args]
if self._fixed:
if not size:
raise IOError("While array length is fixed, size not be none")
else:
if not isinstance(size, int):
raise TypeError("List length must be integer")
self._size = size
self.is_empty = False
none_data = [None] * (self._size - len(self._data))
self._data += none_data
else:
if size:
if not isinstance(size, int):
raise TypeError("List length must be integer")
self._size = size
self.is_empty = False
self._data = [None] * self._size
else:
self._size = 0
self.is_empty = True
self._data = []
def __str__(self):
str_res = """
Array: {array}
empty: {empty}
length: {length}
""".format(array=self._data, empty=self.is_empty, length=self._size)
return str_res
def insert(self, index, value):
"""
if the array is empty, the data will be still insert, and index is 0
:param index: insert index, must be integer
:param value: insert data
:return:
"""
if not isinstance(index, int):
raise TypeError("Index must be integer")
if self.is_empty:
if self._fixed:
self._data = [None] + self._data[1:]
else:
self._data = [value]
self.is_empty = False
self._size += 1
else:
if not self._size > index:
raise IndexError("Index be not more than array length")
else:
if self._fixed:
self._data = self._data[:index] + [value] + self._data[index: -1]
else:
self._data = self._data[:index] + [value] + self._data[index:]
self._size += 1
def append(self, value, sorted=False):
"""
:param value:
:return:
"""
if self._fixed:
raise IOError("The array length is fixed, you need to use insert")
else:
if isinstance(value, list):
if not sorted:
self._data += value
else:
self._data += value
self._data.sort()
self._size += len(value)
self.is_empty = False
else:
if self.is_empty:
self._data = [value]
self.is_empty = False
self._size += 1
else:
self._data += [value]
self._size += 1
def delete(self, index):
"""
:param index:
:return:
"""
if not isinstance(index, int):
raise TypeError("Index must be integer")
if self.is_empty:
raise IOError("The array is empty")
else:
if self._size < index - 1:
raise IndexError("Index be not more than array length")
else:
self._data = self._data[:index] + self._data[index + 1:]
if self._fixed:
self._data += [None]
else:
self._size -= 1
def pop(self, index=None):
"""
:param index:
:return:
"""
if index:
if not isinstance(index, int):
raise TypeError("Index must be integer")
if self.is_empty:
raise IOError("The array is empty")
else:
if not self._size > index:
raise IndexError("Index be not more than array length")
else:
self._data = self._data[:index] + self._data[index + 1:]
if self._fixed:
self._data += [None]
else:
self._size -= 1
else:
if self.is_empty:
raise IOError("The array is empty")
else:
if self._size == 1:
if self._fixed:
self._data = [None]
else:
self._data = []
self._size = 0
self.is_empty = True
else:
self._data = self._data[1:]
if self._fixed:
self._data += [None]
else:
self._size -= 1
def update(self, index, value):
"""
:param index:
:param value:
:return:
"""
if not isinstance(index, int):
raise TypeError("Index must be integer")
if self.is_empty:
raise IOError("The array is empty")
else:
if not self._size > index:
raise IndexError("Index be not more than array length")
else:
self._data = self._data[:index] + [value] + self._data[index + 1:]
if __name__ == '__main__':
array = OwnArray(1, 2, 3, size=5, fixed_size=True)
print(array)
array.insert(2, 5)
print(array)
try:
array.append(4)
print(array)
except Exception as e:
print('append:', e)
array.delete(2)
print(array)
array.pop(1)
print(array)
array.update(2, 9)
print(array)