工作了一段时间后,发现基础实在是太重要了,老话说: 万丈高楼平地起。地基不牢,肯定跑不快,天花板也愈发明显。
除了传统互联网业务,其实认知外围还有很多有趣的事情可以去做,而且这些事情更考验基础能力。躬身入局,探索其中的乐趣。比如我现在做的事情,基本脱离传统互联网业务,遇到了更细微的场景。比如现在做的 ae 二次开发,面对一些场景,需要设计数据结构、考虑内存的高效使用、快速存取;
准备将数据结构再碾压一遍:
那就从最简单的数组开始,自主实现这些数据结构,探索经常使用的api是如何构建的,实现一个好用的Api, 其实也是为客户提供良好服务的体现,服务不应该局限于网络to c ,to b 服务。
2. 实现一个静态数组2.1 示意图2.2 代码如下:#!/usr/bin/env python # -*- coding: utf-8 -*- """ # @Time : 2020/1/18 下午7:36 # @Author : # @Site : # @File : Array.py # @Software: PyCharm # 自己实现的static array """ class Array: def __init__(self, capacity=None): """ 包含无参和有参两种情况 :param capacity: """ if capacity is None: # self.data = [] self._data = [0] * 10 else: self._data = [0] * capacity self._size = 0 def get_size(self): """ 当前结构中已存储的元素的个数 :return: """ return self._size def get_capacity(self): return len(self._data) def is_empty(self): return self._size == 0 def add_first(self, val): self.add(0, val) def add_last(self, val): self.add(self._size, val) def add(self, index, val): """ 向数组指定位置插入val :param index: :param val: :return: """ if self._size == len(self._data): # 已有元素的个数 == 数组的capacity raise (Exception, 'AddList failed. Array is full') if index < 0 or index > self._size: raise (Exception, 'AddList failed. require index >=0 and index <= size') # 目标位置元素向后移动 for i in range(self._size - 1, index - 1, -1): self._data[i + 1] = self._data[i] self._data[index] = val self._size += 1 def to_string(self): res_str_arr = [] res_str_arr.append('Array: size = %d, capacity = %d; ' % (self._size, len(self._data))) for i in range(0, self._size): val = self._data[i] if isinstance(val, int): val = str(val) res_str_arr.append(val) if i != self._size - 1: res_str_arr.append(',') res_str_arr.append(']') return "".join(res_str_arr) def get(self, index): """ 保证数据安全,用户无法知晓整个数组的详情 :param index: :return: """ if index < 0 or index > self._size: raise ValueError('index beyond arr size or index under 0, size is %d' % self._size) return self._data[index] def set(self, index, val): if index < 0 or index > self._size: raise ValueError('index beyond arr size or index under 0, size is %d' % self._size) self._data[index] = val def contains(self, val): for i in range(self._size): if self._data[i] == val: return True return False def find(self, val): for i in range(self._size): if self._data[i] == val: return i return -1 def remove(self, index): """ 从数组中删除某一位置的元素,并返回被删除的元素 :param index: :return: """ if index < 0 or index > self._size: raise ValueError('index beyond arr size or index under 0, size is %d' % self._size) ret = self._data[index] for i in range(index, self._size - 1): self._data[i] = self._data[i + 1] self._size -= 1 return ret def remove_first(self): return self.remove(0) def remove_last(self): return self.remove(self._size - 1) def remove_element(self, val): """ find数组中第一次出现的元素,并删除 :param val: :return: 删除一个元素: 先找 后 删除 """ index = self.find(val) if index != -1: self.remove(index) if __name__ == '__main__': # new 自己的Array 类 arr = Array(20) for i in range(0, 10): arr.add_last(i) print(arr.to_string()) arr.add(1, 666) print(arr.to_string()) arr.add_first(-1) print(arr.to_string()) print(arr.get(0)) print(arr.to_string()) arr.remove(1) print(arr.to_string()) arr.remove(2) print(arr.to_string()) arr.remove_first() print(arr.to_string()) arr.remove_last() print(arr.to_string()) ---来自腾讯云社区的---用户1081422
微信扫一扫打赏
支付宝扫一扫打赏