专栏首页T客来了数据结构-数组

数据结构-数组

摘要

  • 初衷
  • 实现一个静态数组(python 版)

1 初衷

工作了一段时间后,发现基础实在是太重要了,老话说: 万丈高楼平地起。地基不牢,肯定跑不快,天花板也愈发明显。

除了传统互联网业务,其实认知外围还有很多有趣的事情可以去做,而且这些事情更考验基础能力。躬身入局,探索其中的乐趣。比如我现在做的事情,基本脱离传统互联网业务,遇到了更细微的场景。比如现在做的 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())
 

本文分享自微信公众号 - T客来了(ltdo11),作者:bofeng

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数据结构-数组

    杨小杰
  • 搞定数据结构-数组结构

    从数组存储的内存模型来看,“下标”最确切的定义应该是”偏移”,如果用a来表示数组的首地址,a0 就是偏移为0的位置,也就是首地址,a k就表示偏移k个type_...

    用户3045442
  • 数据结构:数组内存模型

    在计算机里,所有的数据结构本质上其实都可以归为两类:数组和链表。对于链表,我将会在第03 与第 04 讲中着重讲解。今天我将要和你一起探索数据结构中最基本的知识...

    码农架构
  • 数据结构|数组,栈和队列[1]

    数组的大小固定,如果存储数量过多,需要重建新数组;同时存储的数据类型单一,每个元素占用内存大小相同;添加,删除,移动操作比较慢,因为需要改变受影响的元素

    rare0502
  • LeetCode-数据结构-数组-第2天

    给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。 初始化 nums1 和 num...

    布衣者
  • LeetCode-数据结构-数组-第1天

    给定一个整数数组,判断是否存在重复元素。 如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。 具体题目链...

    布衣者
  • LeetCode-数据结构-数组-第4天

    在MATLAB中,有一个非常有用的函数 reshape,它可以将一个矩阵重塑为另一个大小不同的新矩阵,但保留其原始数据。给出一个由二维数组表示的矩阵,以及两个正...

    布衣者
  • LeetCode-数据结构-数组-第3天

    思路:通过对nums1和nums2重排,通过对两个列表循环,两列表对比的元素若相同则添加到intersection列表中,若不相等则小元素相应的列表,指针进行向...

    布衣者
  • 数据结构之数组

    一.数组的基本概念 数组可以看成是多个相同类型数据组合,对这些数据的统一管理。 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变...

    xiangzhihong
  • 数据结构01-数组

    数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。

    WindCoder
  • 数据结构之数组

    1、数据结构研究的是数据如何在计算机中进行组织和存储,使得我们可以高效的获取数据或者修改数据。

    别先生
  • 数据结构(5):数组

    数组是由 n(n≥1)个相同类型的数据元素构成的有限序列,每个数据元素称为一个数组元素,每个元素在 n 个线性关系中的序号称为该元素的下标,下标的取值范围称为数...

    不可言诉的深渊
  • 数据结构:数组、链表、栈、队列的理解

    解释定义 数据结构: 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。再简单描述一下:数据结构就是描述对象间逻辑关系的学科。 如果还是不太清楚下面会...

    纪莫
  • js中基础数据结构数组去重问题

    一说到数据结构,很多人就开始头大了,因为总感觉像什么数据结构,算法之类的概念都很高大上,我知道有很多的同学都是毕业后觉得编程高薪,亦或培训速成所以就选择了一门语...

    疯狂的技术宅
  • 比较JavaScript中的数据结构(数组与对象)

    在编程中,如果你想继续深入,数据结构是我们必须要懂的一块, 学习/理解数据结构的动机可能会有所不同,一方面可能是为了面试,一方面可能单单是为了提高自己的技能或者...

    前端小智@大迁世界
  • JavaScript数据结构01 - 数组

    PS:原始值是指固定而简单的值,存放在栈中的简单数据段,它们的值直接存储在变量访问的位置。

    leocoder
  • 数据结构(一):数组篇

    所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标...

    看、未来
  • Excel VBA解读(155): 数据结构—数组相关的函数

    Array函数可以使用一组数据来填充数组。然而,必须将数组变量声明为Variant型。例如代码:

    fanjy
  • R语言基础教程——第3章:数据结构——数组

    数组(array)与矩阵类似,但是维度可以大于2。数组可通过array函数创建,形式如下:

    DoubleHelix

扫码关注云+社区

领取腾讯云代金券